はじめに
本記事は非エンジニア向けに「デッドロックって何?」という話を解説します。
エンジニアの方は「うんうん、そうだよね」と頷いてもらえればと思います。
デッドロックとは
デッドロック (英: deadlock) とは、特に計算機科学において、2つ以上のスレッドあるいはプロセスなどの処理単位が互いの処理終了を待ち、結果としてどの処理も先に進めなくなってしまうことを言う。
なるほどよく分からんですね。
例
お父さん「おーい、ワンピースとヒロアカの最新巻を買ってきたぞー」
兄「やったー、じゃあワンピース→ヒロアカの順に読もう」
弟「やったー、じゃあヒロアカ→ワンピースの順に読もう」
兄「ワンピースを読むぞ(手に取る)」
弟「ヒロアカを読むぞ(手に取る)」
兄「ワンピースを読み終わったぞ、さて次はヒロアカ…あれ、誰かが持っていってるみたいだ」
弟「ヒロアカを読み終わったぞ、さて次はワンピース…あれ、誰かが持っていってるみたいだ」
どちらかが手に持っている巻を返さないと兄も弟も次の巻が読めない状態になってしまいました。
これがデッドロックの状態です。
解説
兄弟はそれぞれの処理です。
漫画はテーブルです。
手に取るのがロックです。
双方の処理がロック待ちになってしまい処理が進まなくなってしまうことをデッドロックと言います。
デッドロックを起こりにくくするために
処理順を統一して
今回の例だと兄がワンピース、弟がヒロアカから読み進めました。
例えば2人ともワンピースから読み進めることにした場合。
兄「ワンピースを読もう」
弟「兄がワンピースを読んでいるから終わるまで待とう」
兄「ワンピースを読み終わったぞ、次はヒロアカを読もう(まだワンピースは手に持っている)」
弟「まだワンピースが本棚に戻らないな、待とう」
兄「両方読み終わったぞ、両方とも本棚に戻そう」
弟「あ、ワンピースが本棚に戻ってきたぞ。早速読もう」
となりデッドロックが発生しません。
このように処理順を統一してあげると良いです。
ロック範囲を小さく
今回の例だと
兄「ワンピース→ヒロアカを読み終わるまで」
弟「ヒロアカ→ワンピースを読み終わるまで」
がそれぞれのロック範囲です。
なので例えば
兄「ワンピースを読み終わるまで」
弟「ヒロアカの1話を読み終わるまで」
のようにロックを取る範囲を狭めて、ロックが終わったら本棚に戻してあげるとデッドロックが発生しにくくなります。
ロック時間を短く
これは単純な処理速度・処理時間を早くするという話で、今回の例だと弟がヒロアカを取る前に兄がワンピース→ヒロアカを読み終えればデッドロックは発生しません。
ロック範囲が広くてもものすごい速読であれば問題は発生しにくいです。
そもそもそのロック必要?
そもそも今回の例だと「ワンピース→ヒロアカ」に関連性はなく、この順に読む必要性がありません。
処理を書く際に「この処理にロックは必要なのか?」というのは今一度検討してみてください。
最後に
非エンジニアの方にデッドロックが何か、が伝わってくれると嬉しいです!
参考
こちらの記事が大変参考になります。
図も分かりやすい。