Mam pytanie odnośnie wątków i blokady monitor. Jak to dokładnie działa.
Powiedzmy, że mam dwa wątki i w nich zakładam blokadę na jakiś współdzielony przez nie zasób. Jeżeli pierwszy wątek uzyska blokadę i wykonuje jakąś operację, następnie zostaje uruchomiony drugi wątek, ale pierwszy nadal ma blokadę, więc wątek drugi zostaje wstrzymany. Następnie znowu uruchamiany jest pierwszy i co teraz się dzieje po zwolnieniu blokady? Czy program pamięta, że ten drugi wątek chciał uzyskać blokadę i wstrzymuje działanie pierwszego wątku? Zgodnie z tym co przeczytałem to tak to powinno działać, bo zostaje dodany do kolejki. No ale to dlaczego jak wywołuję metodę wyświetlającą nazwę wątku otrzymuję coś takiego
Pierwszy
Pierwszy
Drugi
Drugi
Drugi
Pierwszy
Pierwszy
itd.
Dlaczego w takim razie te nazwy się nie przeplatają: Pierwszy, Drugi, Pierwszy itd.
Moja metoda w C#
public void TestLock()
{
lock (objLock)
{
sb.AppendLine(Thread.CurrentThread.Name);
}
}
No chyba, że następuje zwolnienie blokady i akurat wątek zostaje przełączony wtedy nie ma żadnego wątku w kolejce i przez to ten aktywny wątek wykonuje kilka operacji pod rząd. Chyba właśnie to było przyczyną, bo jak utworzyłem 4 wątki to teraz jest to dość mocno poprzeplatane, aczkolwiek zdarzają się sytuacje (sporadycznie) gdzie wyświetla kilka razy pod rząd tą samą nazwę.