出典: フリー百科事典『ウィキペディア(Wikipedia)』 (2022/06/04 23:33 UTC 版)
「食事する哲学者の問題」の記事における「解法の例」の解説
次のコードは、Pascalで書かれた解法の例である(モニタを使用)。 PROGRAM d_p; CONST DoomsDay = FALSE; MONITOR dining_philosophers; // モニタ宣言開始 CONST Eating = 0; Hungry = 1; Thinking = 2; VAR i : INTEGER; // ループ変数初期化 state : ARRAY [0..4] OF INTEGER; // Eating、Hungry、Thinking can_eat : ARRAY [0..4] OF CONDITION; // 哲学者それぞれに対応 // 箸がそろうまで、空腹の哲学者を置く PROCEDURE test(k : INTEGER); BEGIN IF (state[k] = Hungry) AND (state[(k+4) MOD 5] <> Eating) AND (state[(k+1) MOD 5] <> Eating) THEN BEGIN state[k] := Eating; SIGNALC(can_eat[k]); // 待ち状態の者がいればその状態を終了させる END; END; PROCEDURE pickup(i: INTEGER); BEGIN state[i] := Hungry; WRITELN('philosopher ',i,' hungry'); test(i); // 隣の人は食事中か? IF state[i] <> Eating THEN WAITC(can_eat[i]); // 隣人の食事が終わるまで待つ WRITELN('philosopher ',i,' eating'); END; PROCEDURE putdown(i : INTEGER); BEGIN state[i] := Thinking; WRITELN('philosopher ',i,' thinking'); test( (i+4) MOD 5); // 左の隣人が食事するチャンスを与える test( (i+1) MOD 5); // 右の隣人が食事するチャンスを与える END; BEGIN // モニタを初期化 FOR i := 0 TO 4 DO state[i] := Thinking; END; // モニタ定義の終わり PROCEDURE philosopher(i : INTEGER); BEGIN REPEAT pickup(i); // 箸をとる putdown(i); // 箸をおく UNTIL DoomsDay; END; BEGIN // 主プログラム COBEGIN // 5つのプロセスを同時に開始 philosopher(0); philosopher(1); philosopher(2); philosopher(3); philosopher(4); COEND;END 次のコードは、Javaで書かれた解法の例である(セマフォを使用)。 import java.util.concurrent.Semaphore;import java.util.Random;import java.util.Vector;public class Philosopher extends Thread{ private static final Random rand = new Random(); private static int event=0; private static String binary=""; private int id; private Semaphore sem; private static Vector
※この「解法の例」の解説は、「食事する哲学者の問題」の解説の一部です。
「解法の例」を含む「食事する哲学者の問題」の記事については、「食事する哲学者の問題」の概要を参照ください。