五个哲学家公用一张圆桌, 分别坐在周围的五张桌子上, 在圆桌上有五个碗和五只筷子交叉排列, 它们的生活方式是交替的进行思考和进餐. 哲学家进行思考时不用筷子, 饥饿时取一只他两边的任意一只筷子(默认取左边的筷子, 没有时取右边的, 都没有时就取不了), 当他有两只筷子时就能进餐. 进餐后, 放下筷子继续思考.若只有一只筷子, 不放弃该筷子并等待拥有另一只筷子时再进餐.
用一个信号量表示一只筷子, 共五个信号量 semaphore chopsitck[5] = {1, 1, 1, 1, 1}; , 为 1 表示筷子未拿起, 为0表示筷子被拿起.那么第i为科学家的进餐活动就可以描述为
法一:记录型信号量:
do {
wait(chopstick[i]);
wait(chopstick[(i + 1) % 5]);
//eat
signal(chopstick[i]);
signal(chopstick[(i + 1) % 5]);
//think
} while (true);
假设五位哲学家都要拿筷子(都拿左手边), 那么将没有人可以 用餐, 就会陷入死锁状态.则哲学家进餐的解决方法:
1.至多允许四位哲学家拿同一边的筷子, 则可让至少一位哲学家先用餐, 用餐完后释放筷子进而让其他哲学家有机会用餐.
2.五位哲学家先竞争奇数(偶数)好筷子, 在竞争偶数(奇数)号筷子, 总会有一位哲学家能进餐.
法二: AND型信号量
//AND型信号量
semaphore chopstick[5] = {1, 1, 1, 1, 1};
do {
//think
Swait(chopsitck[(i + 1) % 5], chopsitck[i]);
//eat
Ssignal(chopsitck[(i + 1) % 5], chopsitck[i]);
} while (true);