私は食事する哲学者の解決策を経験しました。ある時点で、典型的なモニターの実装は飢餓を引き起こすので。私は食事する哲学者の問題の「丁寧な」バージョンをここで経験しました
monitor diningPhilosophers {
int[] state = new int[5];
boolean[] leftHungry = new boolean[5];
boolean[] rightHungry = new boolean[5];
static final int THINKING = 0;
static final int HUNGRY = 1;
static final int EATING = 2;
condition[] self = new condition[5];
public diningPhilosophers {
for (int i=0;i<5;i++) {
state[i] = THINKING;
leftHungry[i] = false;
rightHungry[i] = false;
}
}
public entry pickUp(int i) {
state[i] = HUNGRY;
test(i);
if (state[i] != EATING)
self[i].wait;
rightHungry(left(i)) = false;
leftHungry(right(i)) = false;
}
ublic entry putDown(int i) {
state[i] = THINKING;
test(left(i));
if (state[left(i)] == HUNGRY)
leftHungry[i] = true;
test(right(i));
if (state[right(i)] == HUNGRY)
rightHungry[i] = true;
}
private test(int i) {
if (state[right(i] != EATING) &&
(state[i] == HUNGRY) &&
(state[left(i)] != EATING) &&
!leftHungry(i) && !rightHungry(i) ) {
state[i] = EATING;
self[i].signal;
}
}
private int left(int i) {
return (i+1)%5;
}
private int right(int i) {
return (i+4)%5;
}
}
では、隣接する2人の哲学者が同時に空腹になった場合はどうなるでしょうか。test(i)は、その左と右の哲学者が空腹であるかどうかをチェックしているので。隣接するものも空腹であることがわかった場合。一種の行き詰まりですね。隣の哲学者がお腹が空いているので、二人とも絶対に食べられないということですか?