TL;DR
複数のスレッドやプロセスが互いにリソースの解放を待つことで、どの処理も進まなくなる状態。
仕組み
デッドロックが起きるには、Coffman conditions の 4 つの条件がすべてそろう必要がある。
例
mutex では、次の順で処理が進むとデッドロックが起きる。
- スレッド A が
mutex_1をロックする - スレッド B が
mutex_2をロックする - スレッド A が
mutex_2を取得しようとするが、スレッド B がロックしているので待つ - スレッド 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 つの方法にまとめている。