哲学家进餐问题
一张圆桌上有五位哲学家 每两位哲学家之间的桌子上摆着一根筷子,桌子中间是一碗米饭,五位哲学家都在用全部精力思考和吃饭
哲学家思考的时候,不会影响其他人,哲学家饥饿时,试图拿起左右两根筷子(一根一根拿起)如果筷子在其他人手上,则需要等待
哲学家只有左右手都拿起筷子 才可进餐,进餐完毕之后 放下筷子 继续思考
这个问题相当于是两个临界资源的使用
各个哲学家拿筷子这件事必须互斥地执行,这就保证了即使一个哲学家拿起筷子到一半的时候被阻塞(拿了一支)
也不会有其他哲学家继续尝试拿筷子,这样的话,当正在吃饭的哲学家放下筷子后,被阻塞的哲学家就可以获得等待的筷子。
semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex=1;//互斥的取筷子
Pi(){
//i号哲学家的进程
while(1){
P(mutex);
P(chopstick[i]);//拿走左边
P(chopstick[(i+1)%5]);//拿走右边
V(mutex);
吃饭
V(chopstick[i]);//放回左边
V(chopstick[(i+1)%5]);//放回右边
思考
}
}
上边这种算法可以有效避免循环等待 发生死锁的现象
这个问题的关键就在于解决进程死锁
以上就是哲学家进餐问题希望对大家有帮助