デッドロックは、2つ以上のスレッドがそれぞれ他方の保持するリソースを永遠に待ち、どれも先へ進めない状態です。 4つの条件(Coffman条件)が同時に成り立つことを要します。
4つの条件
- mutual exclusion(相互排他) — リソースが排他的に保持される。
デッドロックは、2つ以上のスレッドがそれぞれ他方の保持するリソースを永遠に待ち、どれも先へ進めない状態です。 4つの条件(Coffman条件)が同時に成り立つことを要します。
どれか1つを崩せば、デッドロックは起こりえません。
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)でバックオフしてリトライする — hold-and-waitを崩す。デッドロックはシステムを静かに凍りつかせます。クラッシュはなく、ただリクエストがハングします。4つの条件を挙げられることは、なぜ起こるのかを筋道立てて考え、ロックをやみくもにばらまいて祈るのではなく、的を絞った予防策(たいていは一貫したロック順序)を選べることを示します。
ジュニアからシニアまで、詳細な回答付きのIT面接質問ライブラリ。
寄付する