问题描述:
五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。
问题分析:
放在桌子上的筷子时临界资源,在一段时间内只允许一位哲学家使用,为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成信号量数组。
semaphore chopstick[5]={1,1,1,1,1};
每个哲学家先拿他左侧的筷子,即执行wait(chopstick[i]);成功后再拿他右侧的筷子,即执行wait(chopstick[(i+1)%5];便可成功进餐。问题是当五个哲学家都拿完左侧筷子后,五个信号量都为0,再试图去拿右侧的筷子时,都会因无筷子可拿而陷入无限的等待,发生死锁状况。
可用的解决方法:
- 至多只允许有四位哲学家同时去拿左侧的筷子,最终能保证至少有一位哲学家能够进餐,并在用完餐后释放左右两支筷子。
- 仅当哲学家的左、右两支筷子都可用时,才允许他拿起筷子进餐。
- 规定奇数号哲学家先拿他左侧的筷子,然后再拿右侧的筷子;而偶数号哲学家则相反。即:1、2号哲学家竞争1号筷子;3、4号哲学家竞争3号筷子。五位哲学家都先竞争奇数号筷子,获得后再去竞争偶数号筷子。
- 使用AND型信号量:第i位哲学家的活动:
do{
...
//think
...
Swait(chapstick[(i+1)%5],chapstick[i]); //同时申请左右两侧的筷子
...
//eat
...
Signal(chapstick[(i+1)%5],chopstick[i]); //同时释放
}while[TRUE];