TL;DR

複数のスレッドやプロセスが互いにリソースの解放を待つことで、どの処理も進まなくなる状態。

仕組み

デッドロックが起きるには、Coffman conditions の 4 つの条件がすべてそろう必要がある。

例

mutex では、次の順で処理が進むとデッドロックが起きる。

  1. スレッド A が mutex_1 をロックする
  2. スレッド B が mutex_2 をロックする
  3. スレッド A が mutex_2 を取得しようとするが、スレッド B がロックしているので待つ
  4. スレッド B が mutex_1 を取得しようとするが、スレッド A がロックしているので待つ
graph TD
  A[スレッド A] -->|ロック| M1[mutex_1]
  B[スレッド B] -->|ロック| M2[mutex_2]

  A -->|待機| M2
  B -->|待機| M1

  M1 -.->|ロック中| A
  M2 -.->|ロック中| B

Go でチャネルを使ったときの例は、チャネルでのデッドロックにある。

注意点

回避策はデッドロックに対処する 4 つの方法にまとめている。

関連

出典