1、问题描述
有五个哲学家共用一张餐桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式时交替地进行思考和进餐,只有拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。
2、利用记录型信号解决哲学家进餐问题
放在桌子上的筷子是临界资源,在一段时间内只允许一个哲学家使用。为了实现对筷子的互斥使用,可以用一个信号量表示一只筷子,由这五个信号量构成一个信号量数组。
semaphore chopstick[5]={1,1,1,1,1};
void eat(){
while(true){
wait(chopstick[i]);
wait(chopstick[(i+1)%n]);
...
eat something
...
signal(chopstick[i]);
signal(chopstick[(i+1)%n]);
...
think something
...
}
}
当哲学家饥饿时,先拿起左边的筷子,执行wait操作,再拿起右边的筷子,执行wait操作,当吃完后,放下左边的筷子,执行signal操作,再放下右边的筷子,执行signal操作。这样就可以保证相邻的哲学家不会同时吃饭。
但是按照上面的描述,我们猜想,会不会有这样一种情况呢。五个哲学家同时拿起了左边的筷子,五个wait(chopstick[i]),会使得五个互斥信号量均变为0,当他们准备去拿右边的筷子时,发现没有筷子可拿,就无限期的等待,陷入了死锁的状态。
3、利用AND信号量机制解决哲学家进餐问题
我们用AND信号量机制来解决记录型信号量未能解决的问题,现在的情况变为如果该哲学家左右两只筷子都没人用的时候,就同时拿起两只筷子,对左右两只筷子执行Swait操作,用完就放下两只筷子,对左右两只筷子执行Ssignal操作
semaphore chopstick[5]={1,1,1,1,1};
void eat(){
while(true){
Swait(chopstick[i],chopstick[(i+1)%n]);
...
eat something
...
Ssignal(chopstick[i],chopstick[(i+1)%n]);
...
think something
...
}
}