C# parę wątków - 1 funkcja

0

Witam,

   Mam główną funkcję main(), którą wywołuję z kilku-nastu wątków oraz drugą second(). Co jakiś czas owe wątki main() muszą się odwołać do second(). Jak zrobić, żeby wywoływania tej drugiej funkcji second() następowały co 5 sec? Np. zdarzyło się że dwa wątki main() wywołują w tym samym momencie second(), a potrzeba żeby pierwszy wątek wykonał second() a drugi wątek poczekał 5 sekund po wykonaniu second() przez wątek pierwszy i dopiero wtedy wykonał second(). Trochę nagmatwane ale w kodzie pewnie byłoby jeszcze gorzej.

Pozdrawiam

0

Możesz użyć różnych sposobów:

  • System.Threading.Timer
  • AutoResetEvent z timeoutem na 5 sek.

Oczywiście mimo wszystko twoje funkcje powinny być Thread-Safe - czyli nie wykładać programu, gdy 2 wątki jednocześnie się wykonują w tym miejscu.

0
Datetime lastUse = DateTime.MinValue;
third(){
  while(lastUse.AddSeconds(5)>DateTime.Now) System.Threading.Thread.Sleep(100);
  lastUse = DateTime.Now;
  second();
}

Musisz jeszcze użyć jakiegoś z normalnych systemów synchronizacji, by funkcję third() wywoływał tylko 1 wątek jednocześnie.

Zapomniałem jednogo słówka w kodzie.

0
hubert_nnn napisał(a)

Datetime lastUse = DateTime.MinValue;
third(){
while(lastUse.AddSeconds(5)>DateTime.Now) System.Threading.Sleep(100);
lastUse = DateTime.Now;
second();
}

> 
> Musisz jeszcze użyć jakiegoś z normalnych systemów synchronizacji, by funkcję third() wywoływał tylko 1 wątek jednocześnie.


Dochodzi trzeci wątek i sposób przestaje działać.
0

Jaki trzeci wątek?

Funkcja third() jest tylko pośrednikiem między wątkami, a funkcją second, który pilnuje, by second wywoływane było co 5 sekund, a nie wątkiem.

0

Jeszcze jedno pytanie, czym wywołać wątki, żeby każdy wątek wywołujący third "sleepował" tylko siebie a nie wszystkie wątki. Teraz wywołuje na tablicy threadów Thread[] thread = new Thread[x];

0

Trochę się zmieszałem , ustalmy:

  • masz x wątków, które wykonują metodę main()
  • z metody main() przez różne wątki chcesz wywoływać metodę second()
  • metoda second ma być wykonywana co dokładnie 5 sekund tak ? (przez obojętnie jaki wątek..)

?

0
  • metoda second ma być wykonywana co dokładnie 5 sekund tak ? (przez obojętnie jaki wątek..)

Tak, ale gdy używam sposobu z third i mam sleep to wszystkie wątki idą spać, a dobrze by było żeby ten jeden tylko czekał.

0

Thread.Sleep usypia tylko bieżący wątek .. więc nie wiem skąd pewność, że wszystkie ?

0

Funkcja third usypia bieżący wątek do momentu, kiedy możliwe będzie wywołanie przez niego second(), a jeśli oznaczyłeś ją przez [synchronized], to każdy wątek w którym wywałałeś third będzie usypiany i będzie czekał na swoją kolej w dostępie do funkcji second, czyli jeśli masz 4 wątki w1, w2, w3 i w4, to stanie się np coś takiego:

sekunda 0 - w1.third();
sekunda 0 - w2.third();
sekunda 0 - w3.third();

sekunda 0 - w1.second(); //pozostałe w2 i w3 nadal są uśpione
sekunda 5 - w2.second();
sekunda 10 - w3.second();

ponieważ w4 nie wywoływał third(), to ani na chwile nie został uśpiony. Proste.

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