Kilka Wątków i jedna funkcja

0

witam

mam takie zapytanie na poziomie poczatkijace go :)

mianowcie program posiada kilka wątkow korzystających z jednej funkcji (delegate void)
wątki pracują te co 10ms i co tyle odwołują się do tej funkcji.
i teraz moje zapytanie jezeli w tym samym momencie do tej jednej fukcji odowłają sie dwa lub więcej wątkow to te funkcja dla każdego zostanie wykonana niezależnie czy atki zostaną np zakolejkowane i wykonane jeden po drugim ??

z góry dziekuje za odpowieź

pozdrawiam

0

W tym przypadku jest raczej pewne, że kilka wątków będzie jednocześnie wykonywało tę samą metodę. Jeśli w metodzie modyfikujesz jakieś zasoby, które nie powinny być modyfikowane przez kilka wątków równocześnie to powinieneś zapewnić do nich dostęp tylko jednemu wątkowi. A więc jeżeli zależy ci na kolejkowaniu tych wątków użyj klasy Monitor, lub wyrażenia lock(prawdopodobnie jest trochę szybsze):

Monitor.Enter(zamek)
 //tu kod do którego ma mieć dostęp tylko jeden wątek 
Monitor.Exit(zamek)
//lub
lock(zamek)
{
 //tu kod do którego ma mieć dostęp tylko jeden wątek 
}

Jeżeli chciałbyś żeby dostęp miała ograniczona liczba wątków użyj Semaphore.
Tu masz niezłą książkę online w eng
http://www.albahari.com/threading/
Jeśli masz więcej pytań, to może wrzuć trochę kodu, żeby zobaczyć o co dokładnie chodzi

0

a wiec tak
mam takich 6 watkow

        Thread[] thread = new Thread[6];
        private void Thread0()
        {
            Init(0, Number0);
            while (true)
            {
                Read(0);
                Thread.Sleep((int)Milliseconds.Value);
            }
        }
        private void Thread1()
        {
            Init(1, Number1);
            while (true)
            {
                Read(1);
                Thread.Sleep((int)Milliseconds.Value);
            }
        }
        private void Thread2()
        {
            Init(2, Number2);
            while (true)
            {
                Read(2);
                Thread.Sleep((int)Milliseconds.Value);
            }
        }
        private void Thread3()
        {
            Init(3, Number3);
            while (true)
            {
                Read(3);
                Thread.Sleep((int)Milliseconds.Value);
            }
        }
        private void Thread4()
        {
            Init(4, Number4);
            while (true)
            {
                Read(4);
                Thread.Sleep((int)Milliseconds.Value);
            }
        }
        private void Thread5()
        {
            Init(5, Number5);
            while (true)
            {
                Read(5);
                Thread.Sleep((int)Milliseconds.Value);
            }
        }
  • funkcja init tworzy placzenie na pamieci wspoldzielonej

i taka funkcje jest ona nie wypelniona ale pobiera z pamieci dane i je oblicza i przypisuje je do odpowiednich zmiennych

private delegate void delegat(int i);
private void Read(int i)
{
if (Symbol.InvokeRequired)
{
delegat del = new delegat(Read);
this.Invoke(del, new object[] { i });

        }
        else
        {
             // odczytuje z pamieci
            // handle1[i],handle2[i]......handle9[i]
             //przypisuje zmienne
             ///zmienna1[i] = ....... zmienna9[i]
        }
    }
0

..... a i zalezy mi na tym zeby byly wykonywane niezaleznie zeby wywalanie przez jeden watek nie wstzrymywalo drugiego

czy jak wywola w tym samym momencie Read(1) i Read(2) to wykonaja sie niezelznie ??

pozdrawiam

0

Jeżeli chcesz mieć kontrolę nad tym co jest zapisywane do zmienna1[i]...zmienna9[i] to weź te instrukcje w blok:

lock(zamek)
{
 //tu zmieniasz wartości
}

Każdy wątek który nie ma dostępu do zamka będzie czekał przed blokiem lock, aż zamek zostanie zwolniony przez wątek który go zajmuje.
Jako zamek najlepiej zrobić
private readonly object zamek = new object()
w klasie, w której tworzysz wątki

1 użytkowników online, w tym zalogowanych: 0, gości: 1