5.8.2ダイニング・哲学者・ソリューションの使用モニター
次に、我々はダイニング哲学者問題へのデッドロックフリー ソリューションを提示することによって、モニターの概念を説明します。この解決法は、 の両方が利用可能である場合にのみ、哲学者が彼女の箸を拾う可能性があるという制限を課している( )。この解をコード化するためには、哲学者を見つけ出す可能性がある3つの州の中で を区別する必要があります。彼女の2人の 隣人が食べていない場合にのみ、私は変数
state[i] = EATING
を設定することができますenum {THINKING, HUNGRY, EATING} state[5];
哲学者:
(state[(i+4) % 5] != EATING)
と(state[(i+1) % 5] != EATING)
この 目的のために、我々は次のようなデータ構造を紹介します。また
condition self[5];
これは彼女が空腹であるが、 彼女が必要箸を得ることができないとき、私は自分自身を遅らせるために哲学者を許可を宣言する必要があります。
monitor DiningPhilosophers { enum {THINKING, HUNGRY, EATING} state[5]; condition self[5]; void pickup(int i) { state[i] = HUNGRY; test(i); if (state[i] != EATING) self[i].wait(); } void putdown(int i) { state[i] = THINKING; test((i + 4) % 5); test((i + 1) % 5); } void test(int i) { if ((state[(i + 4) % 5] != EATING) && (state[i] == HUNGRY) && (state[(i + 1) % 5] != EATING)) { state[i] = EATING; self[i].signal(); } } initialization code() { for (int i = 0; i < 5; i++) state[i] = THINKING; } }
図5.18食堂哲学者の問題に対するモニタソリューション。
各哲学者は、食事を開始する前に、操作を呼び出す必要があります
pickup()
。この行為は、哲学者 プロセスの中止をもたらす可能性があります。操作が正常に完了すると、 の哲学者が食べることがあります。これに続いて、哲学者はputdown()
オペレーションを呼び出します。条件が十分であるときに交互にself[i].signal()
を呼び出しDiningPhilosophers.pickup(i); ... eat ... DiningPhilosophers.putdown(i);
pickup(i)
コールtest(i)
、。 pickup(i)
は間接的にself[i].signal()
を呼び出す必要がありますか?
ありがとうございました。
いいえ、それは失われた信号ですが、** putdown(i)にとっては重要です** – yakout