哲学家进餐问题:
五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在桌子上有五只碗和五只筷子,他们的生活方式是交替地进行思考和进餐。平时,一个哲学家进行思考,饥饿时便试图取用其左右最靠近他的筷子,只有在他拿到两只筷子时才能进餐。进餐毕,放下筷子继续思考。
解决方式1:最多允许4个哲学家同时去拿左边的叉子。
semaphore fork[5],four=4;
for(int i=0;i<5;i++)fork[i]=1;
cobegin
process philosopher_i(){
while(true){
think();
P(four);//对一般信号量进行P操作
P(fork[i]);
P(fork[(i+1)%5]);//拿到左右边的叉子之后才能开始吃饭
eat();
V(four);//对一般信号量进行V操作
V(fork[i]);
V(fork[(i+1)%5]);//释放左右边的叉子
}
}
coend
解决方式2:奇数哲学家先拿左边叉子再拿右边叉子。
semaphore fork[5],four=4;
for(int i=0;i<5;i++)fork[i]=1;
cobegin
process philosopher_i(){
while(true){
if(i%2){
think();
P(four);//对一般信号量进行P操作
P(fork[i]);
P(fork[(i+1)%5]);//拿到左右边的叉子之后才能开始吃饭
eat();
V(four);//对一般信号量进行V操作
V(fork[i]);
V(fork[(i+1)%5]);//释放左右边的叉子
}else{
think();
P(four);//对一般信号量进行P操作
P(fork[(i+1)%5]);
P(fork[i]);//拿到左右边的叉子之后才能开始吃饭
eat();
V(four);//对一般信号量进行V操作
V(fork[(i+1)%5]);
V(fork[i]);//释放左右边的叉子
}
}
}
coend
解决方式3:当且仅当两边的筷子都可以用的时候才进行进餐
semaphore fork[5],mutex;
for(int i=0;i<5;i++)fork[i]=1;
cobegin
process philosopher_i(){
while(true){
think();
P(mutex);//对一般信号量进行P操作
P(fork[i]);
P(fork[(i+1)%5]);//拿到左右边的叉子之后才能开始吃饭
V(mutex);
eat();
V(fork[i]);
V(fork[(i+1)%5]);//释放左右边的叉子
}
}
coend