哲学家进餐问题
问题描述

问题分析
互斥关系:一个筷子只能被一个哲学家拿。
代码实现
注意到如果所有哲学家都举起左手,那么就会导致死锁,并且产生循环等待。所以,我们需要一种策略打破这种僵局:
- 让最后一个哲学家举起右手;
- 只让四个哲学家上桌吃饭,即将桌子看做一个缓冲区;
- 让哲学家同时拿左右手的筷子;
第三种情况演示:
sem chopstick[5] = {1, 1, 1, 1, 1};
sem mutex = 1;
P(int i) {
while (1) {
P(mutex);
P(chopstick[i]);
P(chopstick[(i + 1) % 5]);
V(mutex);
... 吃饭
V(chopstick[i]);
V(chopstick[(i + 1) % 5]);
}
}
第二种情况:
sem chopstick[5] = {1, 1, 1, 1, 1};
sem mutex = 1;
P(int i) {
while (1) {
if (i != 4) {
P(chopstick[i]);
P(chopstick[(i + 1) % 5]);
} else {
// 最后一个哲学家先拿右手
P(chopstick[(i + 1) % 5]);
P(chopstick[i]);
}
... 吃饭
V(chopstick[i]);
V(chopstick[(i + 1) % 5]);
}
}