模拟有五个哲学家的哲学家进餐问题。
问题描述:哲学家的生活就是思考和吃饭,即思考,饿了就餐,再思考,循环往复。要求是:每一个哲学家只有在拿到位于他左右的筷子后,才能够就餐;哲学家只能先拿左边的筷子,再去拿右边的筷子,而不能同时去抓他两边的筷子,也不能从其他哲学家手中抢夺筷子;哲学家每次就餐后必须放下他手中的两把筷子后恢复思考,不能强抓住餐具不放。
以下给出了三种解决死锁问题的方法,请仔细阅读,选择一种实现。
原理A:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。将room作为信号量,只允许4个哲学家同时进入餐厅就餐,这样就能保证至少有一个哲学家可以就餐,而申请进入餐厅的哲学家进入room的等待队列。根据FIFO的原则,总会进入就餐。因此不会出现饿死和死锁的现象。
伪码
Semaphore chopstick[5]={1,1,1,1,1};
Semaphore room=4;
Void philosopher(int i)
{
while(true)
{
Think();
Wait(room); //请求进入房间进餐
wait(chopstick[i]);//请求左手边的筷子