1、问题描述
一张圆桌上有5名哲学家,没两个哲学家之间有一根筷子,桌子中间由一碗米饭。当哲学家饥饿时会试图分别拿起左右两根筷子,如果筷子已在他人手上则需等待。饥饿的哲学家只有拿起两根筷子才能进餐,吃完后才能放下筷子。
2、问题分析
对哲学家分别编号0,1,2,3,4,对筷子编号0,1,2,3,4。i号哲学家左边筷子编号为i,右边编号为(i+1)%5。
(1)方案1
最多允许4个哲学家同时申请进餐,这样可以保证至少有一个哲学家有两根筷子
(2)方案2
要求奇数号的哲学家先拿左边的筷子,然后拿右边的筷子,偶数号哲学家相反
semaphore chopstick[5]={1,1,1,1,1};
Pi(){
while(1){
if(i%2!=0){
P(chopstick[i]);
P(chopstick[(i+1)%5]);
}else{
P(chopstick[(i+1)%5]);
P(chopstick[i]);
}
进餐
V(chopstick[i]);
V(chopstick[(i+1)%5]);
}
}
(3)方案3
仅当哲学家两边的筷子都可以拿起的时候才能申请进餐
semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex=1;
Pi(){
while(1){
P(mutex);
P(chopstick[i]);
P(chopstick[(i+1)%5]);
V(mutex);
吃饭
V(chopstick[i]);
V(chopstick[(i+1)%5]);
}
}