2012-02-21 14 views
7

Mam 6 wątków. Jedna z wątków wchodzi w pewnym zakresie i włącza "blokadę", a wszystkie pozostałe wątki oczekują i chcą wejść na ten sam zakres.Czy "blokada" zabiera czas procesora?

Teraz, czy inne wątki otrzymają czas procesora? Czy drugi wątek znajduje się w harmonogramie wątków? Rozumiem, że wszystkie pozostałe wątki są w stanie oczekiwania, ale procesor spróbuje kontynuować wątek i spróbuje wejść w zakres (nawet jeśli zasięg nie jest dostępny)

+1

Rozumiem, że pozostałe wątki nadal będą otrzymywały czasy, które będą używane do sprawdzania stanu blokady. Jeśli blokada jest nadal na miejscu, wrócą do snu, w przeciwnym razie będą kontynuować. – xbonez

+0

to też zrozumiałem - ale to wymaga czasu procesora ... więc jest to trochę zajęty czekaniem - i to jest bardzo złe. – Yanshof

Odpowiedz

10

Podczas próby wprowadzenia blokady, która jest już zrobione, wątki pierwszy spinlock na chwilę, a na końcu zawiesić i wprowadzić stan oczekiwania.

Nadal płoną czas procesora, gdy się obracają, ale już nie raz.

+6

Aby rozszerzyć trochę: wirwait jest wykonywany, ponieważ jest tańszy niż przejście jądra, a zatem optymalizuje dla przypadku, w którym blokada jest tylko lekko walka. – Richard

+0

co to jest spinlock? czy możesz odpowiedzieć w jednym zdaniu? –

+2

@Royi Wątek stale sprawdza, czy wygląd jest wolny w pętli. Coś jak 'while while (! Lock.TryEnter()) {}' Spala procesor, ale unika narzutów związanych z przejściem jądra i planowaniem wątków. Dobrze, jeśli zamek wkrótce się uwolni, ale zły, jeśli trwa dłużej. Dlatego właśnie blokują spinlocks na krótką chwilę, a potem czekają. – CodesInChaos

0

To nie działa jak zamek. Nie dasz nikomu więcej "czasu procesora". Jeśli blokujesz, możesz wprowadzić okresy oczekiwania i potencjalnie zakleszczenia, w których wątki czekają na siebie nawzajem.

Powiązane problemy