Zakleszczenie to stan, w którym dwa lub więcej wątków czeka w nieskończoność na zasób trzymany przez pozostałe, więc żaden nie może się posunąć naprzód. Wymaga jednoczesnego spełnienia czterech warunków (warunki Coffmana).
Zakleszczenie to stan, w którym dwa lub więcej wątków czeka w nieskończoność na zasób trzymany przez pozostałe, więc żaden nie może się posunąć naprzód. Wymaga jednoczesnego spełnienia czterech warunków (warunki Coffmana).
Przełam którykolwiek jeden, a zakleszczenie staje się niemożliwe.
Thread 1 holds A, wants B ─┐
├─ circular wait → deadlock
Thread 2 holds B, wants A ─┘
# DEADLOCK: threads lock in opposite orders
def t1():
with lockA:
with lockB: ... # T1: A then B
def t2():
with lockB:
with lockA: ... # T2: B then A ← cycle!
# FIX: impose a global lock ordering (always A before B)
def safe():
with lockA:
with lockB: ... # everyone acquires in the same order
tryAcquire(timeout), wycofaj się i ponów — przełamuje trzymaj-i-czekaj.Zakleszczenia zamrażają systemy po cichu — bez awarii, jedynie zawieszone żądania. Nazwanie czterech warunków pokazuje, że potrafisz rozumować o tym, dlaczego do niego dochodzi, i dobrać celowaną prewencję (zwykle spójną kolejność blokowania), zamiast rozsypywać blokady i liczyć na szczęście.
Biblioteka pytań rekrutacyjnych IT ze szczegółowymi odpowiedziami — od Juniora do Seniora.
Wesprzyj