解法の例とは? わかりやすく解説

解法の例

出典: フリー百科事典『ウィキペディア(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; // EatingHungryThinking 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 vector = new Vector(); public Philosopher(int i, Semaphore s) { id = i; sem = s; binary = binary + "0"; } private void busy() { try { sleep(rand.nextInt(1000)); } catch (InterruptedException e){} } private void thinking() { String str = "Philosopher " + id + " is thinking"; vector.add( this.addToObject(System.currentTimeMillis(), event , str) ); event++; busy(); } private void eating() { String str ="Philosopher " + id + " is hungry and is trying to pick up his chopsticks"; vector.add( this.addToObject(System.currentTimeMillis(), event , str) ); event++; busy(); str = "Philosopher " + id + " is eating"; this.oneToBinary(id); vector.add( this.addToObject(System.currentTimeMillis(), event , str) ); event++; busy(); str = "Philosopher " + id + " finished eating, and puts away his chopsticks"; this.zeroToBinary(id); vector.add( this.addToObject(System.currentTimeMillis(), event , str) ); event++; } private Object[] addToObject(long t, int i,String s ){ Object[] o = new Object[4]; o[3] = s; o[2] = i; o[1] = binary; o[0] = t; return o; } private void oneToBinary(int i){ binary = binary.substring(0,i) + "1" + binary.substring(i+1); } private void zeroToBinary(int i){ binary = binary.substring(0,i) + "0" + binary.substring(i+1); } @Override public void run() { for (int i = 0; i < 10; ++i) { thinking(); try { sem.acquire(); } catch (InterruptedException e){} eating(); sem.release(); } } public static void main(String[] args) { final int N = 5; Semaphore sem = new Semaphore(N, true); Philosopher[] philosopher = new Philosopher[N]; // 哲学者生成 for (int i = 0; i < N; i++) { philosopher[i] = new Philosopher(i, sem); philosopher[i].start(); } // 完了待ち合わせる for (int i = 0; i < N; i++) { try { philosopher[i].join(); } catch(InterruptedException ex) { return; } } for (int i = 0; i < vector.size(); i++) { Object[] o = vector.get(i); System.out.printf("%d %d %s %s\n", o[0], o[2], o[1], o[3]); } }}

※この「解法の例」の解説は、「食事する哲学者の問題」の解説の一部です。
「解法の例」を含む「食事する哲学者の問題」の記事については、「食事する哲学者の問題」の概要を参照ください。

ウィキペディア小見出し辞書の「解法の例」の項目はプログラムで機械的に意味や本文を生成しているため、不適切な項目が含まれていることもあります。ご了承くださいませ。 お問い合わせ



英和和英テキスト翻訳>> Weblio翻訳
英語⇒日本語日本語⇒英語
  

辞書ショートカット

すべての辞書の索引

「解法の例」の関連用語

解法の例のお隣キーワード
検索ランキング

   

英語⇒日本語
日本語⇒英語
   



解法の例のページの著作権
Weblio 辞書 情報提供元は 参加元一覧 にて確認できます。

   
ウィキペディアウィキペディア
Text is available under GNU Free Documentation License (GFDL).
Weblio辞書に掲載されている「ウィキペディア小見出し辞書」の記事は、Wikipediaの食事する哲学者の問題 (改訂履歴)の記事を複製、再配布したものにあたり、GNU Free Documentation Licenseというライセンスの下で提供されています。

©2025 GRAS Group, Inc.RSS