盘一盘哲学家进餐问题
1.问题描述
五个哲学家,一块在切饭,每个哲学家之间,放了一根筷子,并且每次拿筷子的时候,只能从左边或者右边拿一根。只有同时拿了左右筷子之后才能切饭。
2.出现的问题&应用场景
问题:在并发的情况下,每个哲学家都拿起了左手边的筷子,就导致了每个哲学家都缺少右手边的筷子,就造成了死锁的情况。
场景:用于解决进程同时持有两个临界资源,干掉死锁的问题
3.解决方案
semaphore chopstick[5] = {1,1,1,1,1}; // 每个筷子的信号量
semaphore mutext = 1; // 互斥取得筷子
Pi(){
while(1){
P(mutext);
P(chostick[i]); // 拿左边
P(chostick[ (i+1) % 5]); // 拿右边
V(mutex);
吃饭
V(chopstick[i]); // 放左
V(chopstick[ (i+1) % 5]); // 放右
发呆
}
}
mutex信号量,用于每次只有一个哲学家在拿筷子。即使进程发生切换mutex也把其他哲学家给拦住。
在一个哲学家A恰饭的时候,即使另一个哲学家B可以拿筷子了,可是由于A把B需要用到的一只筷子给拿着了,chopstick这个信号量就把B给拦下来了。