問題描述
方案一:
#define N 5 //哲學(xué)家個(gè)數(shù)
semaphore fork[5]; //信號(hào)量初始值為1
void philosopher(int i){ //哲學(xué)家編號(hào):0-4
while(true){
think(); //哲學(xué)家在思考
P(fork[i]); //去拿左邊的叉子
P(fork[(i+1)%N]); //去拿右邊的叉子
eat(); //吃面條中
V(fork[i]); //放下左邊的叉子
V(fork[(i+1)%N]); //放下右邊的叉子
}
}
該方案能滿足大多數(shù)情況馁蒂,但仍存在這么個(gè)情況用僧,5個(gè)哲學(xué)家同時(shí)拿起左邊的刀叉,那么會(huì)導(dǎo)致沒有人可以吃面條辰如,導(dǎo)致死鎖普监。
方案二:使用一個(gè)信號(hào)量,保證只有一個(gè)人就餐
#define N 5 //哲學(xué)家個(gè)數(shù)
semaphore fork[5]; //信號(hào)量初始值為1
semaphore mutex; //互斥信號(hào)量琉兜,初始值為1
void philosopher(int i){ //哲學(xué)家編號(hào):0-4
while(true){
think(); //哲學(xué)家在思考
P(mutex); //進(jìn)入臨界區(qū)
P(fork[i]); //去拿左邊的叉子
P(fork[(i+1)%N]); //去拿右邊的叉子
eat(); //吃面條中
V(fork[i]); //放下左邊的叉子
V(fork[(i+1)%N]); //放下右邊的叉子
V(mutex); //退出臨界區(qū)
}
}
該方案是正確的凯正,不存在死鎖,但效率很低豌蟋。
方案三:設(shè)置哲學(xué)家拿刀叉的時(shí)候存在差異廊散,分奇偶來確定拿刀叉的方式
#define N 5 //哲學(xué)家個(gè)數(shù)
semaphore fork[5]; //信號(hào)量初始值為1
void philosopher(int i){ //哲學(xué)家編號(hào):0-4
while(true){
think(); //哲學(xué)家在思考
if (i % 2 == 0){
P(fork[i]); //去拿左邊的叉子
P(fork[(i+1)%N]); //去拿右邊的叉子
} else {
P(fork[(i+1)%N]); //去拿右邊的叉子
P(fork[i]); //去拿左邊的叉子
}
eat(); //吃面條中
V(fork[i]); //放下左邊的叉子
V(fork[(i+1)%N]); //放下右邊的叉子
}
}
注意:這里只需要對P操作進(jìn)行分類,對V操作不需要進(jìn)行分類梧疲,因?yàn)閂操作是不會(huì)阻塞的允睹。