哲学者の食事（Lock版）

ここではコンピュータ科学の分野では広く知られた例題「哲学者の食事(The Dining Philosophers Problem, E. Dijkstra)」を取り上げてみます。

５人の哲学者が円卓につき、思索と食事にのみ時間を費やしている。彼らの前にはそれぞれスパゲッティーを盛った皿があり、皿と皿の間に１本ずつフォークが置かれている。スパゲッティーは２本のフォークを使わないと食べられない。哲学者は空腹を覚えると、左または右のフォークを手に取り、次にもう一方のフォークを取ろうと試みる。２本のフォークを手にできれば食事をし、食事が済むとフォークを置いて思索に戻る。フォークは共有されているので、隣の哲学者が食事をしている間はフォークが空くのを待つ。５人全員が同時に左の（あるいは右の）フォークを取ると、誰も食事ができずに飢えてしまう。

この問題の目標は、哲学者が誰も飢えないようなスケジューリングの方法を示すことですが、ここではこの問題を Objective-C のスレッドとロックを使って単純に実現するだけにします。ですから、プログラムはデッドロックを発生して止まります。デッドロックが発生しないうまいアルゴリズムは並列プログラミングの参考書などに掲載されていますので、興味のある人は調べてみて下さい。

実行例

% ./phils 
Philosopher #0
Philosopher #1
Philosopher #1
Philosopher #2
Philosopher #1
Philosopher #3
Philosopher #3
Philosopher #2
Philosopher #3
Philosopher #0
Philosopher #4

Philosopher #1: WaitRight
Philosopher #2: WaitRight
Philosopher #3: WaitRight
Philosopher #4: WaitRight
Philosopher #5: WaitRight

いずれかの時点でデッドロックを起こして停止しますので、リターンキーを入力して下さい。その時点での状態が表示されます。
