Dziś kolejny mechanizm potrzebny do zrozumienia struktury SpinWait, którą opiszę w następnym poście. Thread.Yield oddaje wątek z powrotem do CPU. Wywołanie mówi, że nie mam nic więcej do roboty i jeśli CPU ma coś lepszego do zrobienia to niech to zrobi a po tym dopiero wątek macierzysty zostanie wznowiony. Innymi słowy jeśli wątek A wywołuje Thread.Yield wtedy CPU zawiesza go, wykonuje inny i potem z powrotem powraca do wątku A. Jednak należy zaznaczyć, że w przypadku Yield, może zostać wybrany wątek wyłącznie wykonywany na tym samym procesorze. Nie można ustąpić miejsca na rzez wątku znajdującego się na innym rdzeniu.
Thread.Sleep (0) oraz Thread.Sleep(1) wykonują to samo z tym, że:
Metoda | Opis |
Thread.Sleep( 0 ) |
Ustąpienie miejsca wątkowi o wyższym lub takim samym priorytecie, który może zostać wykonany na dowolnym procesorze. Wolniejszy sposób niż Thread.Yield ale szybszy niż Thread.Sleep(1). |
Thread.Sleep (1) |
Ustąpienie miejsca wątkowi o dowolnym priorytecie, wykonywanym na dowolnym procesorze. Najwolniejsza z 3 metod. |
Thread.Yield() |
Ustąpienie miejsca wątkowi o wyższym\takim samym priorytecie, wykonywanym na tym samym procesorze. Bardzo szybka metoda. Zwraca true gdy znaleziono kandydata na rzez którego należy ustąpić miejsce |
Powyższe metody przydatne są w programowaniu współbieżnym bez stosowania blokad. W następnym poście przedstawię stos działający w środowisku wielowątkowym ale nie wykorzystujący lock’ow. Oczywiście Thread.Yield nie spowoduje, że inny wątek zostanie w całości wykonany. Jest to wyłącznie oddanie trochę czasu. Task scheduling to skomplikowany mechanizm i nigdy nie wiadomo, kiedy wątek zostanie wstrzymany.