Deadlock — łamigłówka o kolejności blokad
Zmień kolejność pobierania blokad, aby żaden wątek nie czekał w nieskończoność. Łamigłówka o regule globalnej kolejności blokad.
Zmień kolejność w wątkach, aby żadne dwa nie czekały na siebie w nieskończoność.
- 🔒 A
- 🔒 B
- 🔒 B
- 🔒 A
Jak grać
- Każdy wiersz to wątek, a żetony to blokady, które pobiera od lewej do prawej.
- Przeciągnij żeton (lub użyj strzałek), aby zmienić kolejność pobierania blokad.
- Jeśli dwa wątki wezmą tę samą parę w odwrotnej kolejności, mogą zamrozić się na zawsze. Rozwiązaniem jest jedna globalna kolejność dla wszystkich — naciśnij Uruchom, aby sprawdzić.
Jak to działa
Każdy wiersz to wątek, a każdy żeton to blokada, którą pobiera od lewej do prawej. Gdy dwa wątki biorą tę samą parę w odwrotnej kolejności, istnieje przeplot, w którym każdy trzyma jedną i czeka na drugą — i żaden już nie ruszy. Naciśnij Uruchom: graf oczekiwania jest sprawdzany pod kątem cyklu, a winne blokady świecą na czerwono. Rozwiązaniem jest reguła prawdziwych baz kodu: wybrać jedną globalną kolejność blokad i trzymać się jej wszędzie.
Łamigłówka edukacyjna. Modeluje cykle hold-and-wait, czyli warunek zakleszczenia, który da się wyeliminować projektowo; prawdziwe systemy mają też limity czasu, struktury bez blokad i muszą myśleć o livelocku.
Najczęstsze pytania
Co naprawdę powoduje tu zakleszczenie?
Cykl w grafie oczekiwania. Jeśli wątek 1 trzyma A i chce B, a wątek 2 trzyma B i chce A, oba czekają w nieskończoność. Gra rysuje dokładnie ten cykl.
Dlaczego posortowanie blokad pomaga?
Jeśli wszystkie wątki pobierają blokady w tej samej globalnej kolejności, cykl jest niemożliwy: wątek może czekać tylko na blokadę późniejszą niż te, które trzyma, więc graf pozostaje acykliczny.
Czy tak wykrywa się prawdziwe zakleszczenia?
Sprawdzanie cyklu to ta sama idea, co w detektorach inwersji kolejności blokad, np. ThreadSanitizer. Prawdziwe narzędzia obserwują kolejność w czasie działania; tu widzisz cały graf naraz.