問題

人の哲学者が食事したり、考え事をしたりしている。かれらのいる大学には、真ん中にスパゲッティの入った大きなボールが置かれた丸い食卓がある。その食卓には5枚の皿が置かれ、皿と皿の間にフォークが1本ずつ置かれている。 スパゲッティをボールから取って自分の皿によそうには2本のフォークを必要とし、哲学者は一度に1本のフォークしかテーブルから取ることができない。(左右の手で同時に両側にある2本のフォークを取ることはできない、という意味。まずどちらかの側のフォークを取ってから、逆の側のフォークを取る。)哲学者同士は決して会話をしない。このため、5人が左のフォークを手にとって右のフォークが食卓に置かれるのを待つという危険なデッドロック状態が発生する可能性がある。 本来、デッドロック問題の解説手段として使われた。このシステムがデッドロックに到るのは「満たされない要求の円環」が存在する場合である。例えば、哲学者 P1 が哲学者 P2 の手にしているフォークを待っていて、P2 は哲学者 P3 のものを……といったように円環形に要求が連鎖する。 タイミングによっては、ある哲学者が両方のフォークを取れない状況がデッドロックとは別に発生する。これをリソーススタベーションと呼ぶ(スタベーションとは「飢餓」であり、この用語も「食事する哲学者の問題」のアナロジーに付随したジョークが起源である)。例えば、一方のフォークを取った状態でもう一方のフォークを5分間待ったら、一旦フォークを置いて5分間待ってから再度食事を試みるという規則を設定する。この方法ではデッドロックは回避される(システムは異なった状態に変化していく)が、ライブロック状態は回避できない。もし5人の哲学者が全く同時に食卓に着いたとしたら、いっせいに左のフォークを取って5分間右のフォークを待ち、左のフォークをいっせいに置いて5分間待つという状況が発生する。

ダイクストラの解法

ひとつの解法は、フォークに順番を付け、哲学者が所定の順番でフォークを手に取るというものである。この解法では、哲学者を P1, P2, P3, P4, P5とし、フォークを F1, F2, F3, F4, F5 とする。一番目の哲学者(P1)は一番目のフォーク(F1)を取ってから二番目のフォーク(F2)を取る。P2 から P4 の哲学者も同様の手順で Fx+1 のフォークを取る前に Fx を取る。ただし、哲学者 P5 は F5 のフォークを取る前に F1 のフォークを取ろうとする。この P5 の動作の違いが非対称性を生み、デッドロックを回避させる。