1.最多允许四个哲学家同时进餐,保证有一个筷子是空闲的,从而保证能有有一个哲学家成功进餐,而不导致死锁
cpp
semaphore chopstick[5] = {1, 1, 1, 1, 1}, mutex=4;
Pi(){
do{
think...
P(mutex);
P(chopstick[i]);
P(chopstick[(i+1)%5);
eat...
V(mutex);
V(chopstick[i]);
V(chopstick[(i+1)%5);
}while(1);
}
2.给哲学家编号,要求奇数哲学家先拿左边的筷子,再拿右边的筷子,而偶数哲学家相反
cpp
semaphore chopstick[5] = {1,1,1,1,1}; //初始化信号量
void philosopher(int i){
do {
thinking...
if(i%2 == 1){
P(chopstick[i]);//判断哲学家左边的筷子是否可用
P(chopstick[(i+1)%5]);//判断哲学家右边的筷子是否可用
}else{
P(chopstick[(i+1)%5]);//判断哲学家右边的筷子是否可用
P(chopstick[i]);//判断哲学家左边的筷子是否可用
}
eat...
V(chopstick[i]);
V(chopstick[(i+1)%5]);
}while(1);
}
3.一名哲学家左右两边的筷子均可用
时,才允许进餐
cpp
semaphore chopstick[5] = {1, 1, 1, 1, 1},mutex=1;
Pi(){
do{
think...
P(mutex); //使用一个互斥信号量,保证拿起左右两边的筷子是一气呵成的操作
P(chopstick[i]);
p(chopstick[(i+1)%5]);
V(mutex);
eating...
V(chopstick[i]);
V(chopstick[(i+1)%5]);
}while(1);
}