僕がまだ、プログラマとしてバリバリ(?)働いていた時の話。
…と
その前にタイトルに書いた「デッドロック」の説明をしないといけないですね。
定義では「2つ以上のスレッドあるいはプロセスなどの処理単位が互いの処理終了を待ち、結果としてどの処理も先に進めなくなってしまう」ことらしいのですが…。
これだけで分かったアナタはエラいっ
具体例で書くと、
AさんとBさんがコンビニ弁当を1つ買って、一緒に仲良く食べることになったとします。
しかし、袋を開けるとお箸が1セット(左右の2本)しか入っていませんでした。
2本の内の1本(左)のお箸をAさんが手にとりました。
同時にBさんも片方(右)のお箸を手にとりました。
2人とも不器用なので2本(左右)のお箸がないと弁当を食べることができません。
Aさんは、仕方なくBさんがお箸を置くのを待ちます。
Bさんも同じくAさんがお箸を置くのを待ちます。
・・・・
結局、2人とも決して自分の持っているお箸を譲らなかったので永遠にコンビニ弁当を食べることができませんでした。
めでたし、めでたし。
ということらしいです
現実の世界では、AさんとBさんが意思疎通して順番にお箸を譲り合えば仲良くコンビニ弁当を食べることができるのですが、プログラムの世界ではこの「意思疎通」の部分はプログラマが考慮して作らなければなりません。
実際にプログラムの中で、このデッドロックが起きるとどうなるか…。
はい。
上の具体例のように永遠に次の処理ができない…つまり固まった状態になります
プログラマにとって、デッドロックはとても厄介なバグなんです
理由は、「誰と誰が譲り合ってねぇのか発見しにくい」からなんです。
もう1つ、
原因が分かってとしても、「どう修正すべきか」すごく難しいんです。
ちなみに、デッドロックはデータベースという、データを格納する部分の処理で起きることが多いです
さ、前置きが長くなりましたが…。
(最近、前置きの長い記事が多いよね
)
僕が携わっていたプロジェクトも大詰めに差しかかり、本稼働に向けたテストを行っている時期でした。
24時間稼働しているプログラムなんかは、日次処理といって日付が変わる時に処理を行うことが多いのですが…、んー、アメブロだったら日付が変わるとペタ数などがリセットされますよね
はい。
ちょうどこの日次処理のテストをしている最中に起こってしまいました、デッドロックが…
原因は僕らのチームではなく、他のチーム(他会社の方々)にあることは分かってたのですが、当然、この原因が解決され全て動作するまで帰るわけにはいきません。
ちなみに、日次処理のテストなので時刻は深夜0時
さてさて、1時間経っても、2時間経っても解決策が出てきません。
僕はというとテストが再開されない限り、何もやることがないのでタバコを吸いに喫煙室に向かいました
喫煙室に入ると、問題を発生させてしまったチームの2人が熱い議論を交わしてました。
「この処理の時にここをこうすれば…」
「いや、違うだろっ!そうするとこっちがダメになるだろっ!!」
とにかくデカい声で議論してました。
「うわー…、デッドロックの対応大変だなぁ」と思いながら、ふと喫煙室にあるテーブルに目をやると…
「だからここがーっ!」と指差してる先にはマイルドセブンの箱が…。
「そうするとこっちがっ!」と指差してる先にはキャビンの箱が…。
(お…お前ら、確かに「机上の理論」は大事だが、そこでタバコの箱使うか?
)
終いにゃ百円ライターまで並べて考え出す始末。
さすがに17~8時間ぐらいぶっ通しで働いてるため、こっちは妙なテンション。
タバコの箱2つと百円ライター1つを並べて、「うーん」と必死に考えてる2人を見て、こっちは「ぶっ」と吹き出しそうになり慌てて喫煙室から避難しましたわぃ
いやー、皆さん。
デッドロックは怖いモンですな。
…と

その前にタイトルに書いた「デッドロック」の説明をしないといけないですね。
定義では「2つ以上のスレッドあるいはプロセスなどの処理単位が互いの処理終了を待ち、結果としてどの処理も先に進めなくなってしまう」ことらしいのですが…。
これだけで分かったアナタはエラいっ

具体例で書くと、
AさんとBさんがコンビニ弁当を1つ買って、一緒に仲良く食べることになったとします。
しかし、袋を開けるとお箸が1セット(左右の2本)しか入っていませんでした。
2本の内の1本(左)のお箸をAさんが手にとりました。
同時にBさんも片方(右)のお箸を手にとりました。
2人とも不器用なので2本(左右)のお箸がないと弁当を食べることができません。
Aさんは、仕方なくBさんがお箸を置くのを待ちます。
Bさんも同じくAさんがお箸を置くのを待ちます。
・・・・
結局、2人とも決して自分の持っているお箸を譲らなかったので永遠にコンビニ弁当を食べることができませんでした。
めでたし、めでたし。
ということらしいです

現実の世界では、AさんとBさんが意思疎通して順番にお箸を譲り合えば仲良くコンビニ弁当を食べることができるのですが、プログラムの世界ではこの「意思疎通」の部分はプログラマが考慮して作らなければなりません。
実際にプログラムの中で、このデッドロックが起きるとどうなるか…。
はい。
上の具体例のように永遠に次の処理ができない…つまり固まった状態になります

プログラマにとって、デッドロックはとても厄介なバグなんです

理由は、「誰と誰が譲り合ってねぇのか発見しにくい」からなんです。
もう1つ、
原因が分かってとしても、「どう修正すべきか」すごく難しいんです。
ちなみに、デッドロックはデータベースという、データを格納する部分の処理で起きることが多いです

さ、前置きが長くなりましたが…。
(最近、前置きの長い記事が多いよね
)僕が携わっていたプロジェクトも大詰めに差しかかり、本稼働に向けたテストを行っている時期でした。
24時間稼働しているプログラムなんかは、日次処理といって日付が変わる時に処理を行うことが多いのですが…、んー、アメブロだったら日付が変わるとペタ数などがリセットされますよね

はい。
ちょうどこの日次処理のテストをしている最中に起こってしまいました、デッドロックが…

原因は僕らのチームではなく、他のチーム(他会社の方々)にあることは分かってたのですが、当然、この原因が解決され全て動作するまで帰るわけにはいきません。
ちなみに、日次処理のテストなので時刻は深夜0時

さてさて、1時間経っても、2時間経っても解決策が出てきません。
僕はというとテストが再開されない限り、何もやることがないのでタバコを吸いに喫煙室に向かいました

喫煙室に入ると、問題を発生させてしまったチームの2人が熱い議論を交わしてました。
「この処理の時にここをこうすれば…」
「いや、違うだろっ!そうするとこっちがダメになるだろっ!!」
とにかくデカい声で議論してました。
「うわー…、デッドロックの対応大変だなぁ」と思いながら、ふと喫煙室にあるテーブルに目をやると…
「だからここがーっ!」と指差してる先にはマイルドセブンの箱が…。
「そうするとこっちがっ!」と指差してる先にはキャビンの箱が…。
(お…お前ら、確かに「机上の理論」は大事だが、そこでタバコの箱使うか?
)終いにゃ百円ライターまで並べて考え出す始末。
さすがに17~8時間ぐらいぶっ通しで働いてるため、こっちは妙なテンション。
タバコの箱2つと百円ライター1つを並べて、「うーん」と必死に考えてる2人を見て、こっちは「ぶっ」と吹き出しそうになり慌てて喫煙室から避難しましたわぃ

いやー、皆さん。
デッドロックは怖いモンですな。