哲学家进餐问题

一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭。哲学家们倾注毕生的精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿时,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿起两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

我们给每根筷子都从0-4标号,给每个哲学家都0-4标号

每个哲学家左侧的筷子编号=哲学家编号

每个哲学家右侧的筷子编号=(哲学家编号+1)%5

semaphore chopstick[5]={1,1,1,1,1}
Processi(){
  while(true){
    P(chopstick[i]);//锁上左边的筷子
    P(chopstick[(i+1)%5]);//锁上右边的筷子
    吃饭;
    V(chopstick[i]);//锁上左边的筷子
    V(chopstick[(i+1)%5]);//锁上右边的筷子
  }
}

这时候就会出现问题,每个哲学家如果同时肚子饿,他们都会同时拿起左边的筷子,但这个时候发现右边的筷子已经被人占用了,他们会循环等待右边的人放下筷子(阻塞)发生了死锁

上面的解决方法显然不合理

因此要保证拿起两只筷子的过程一气呵成

semaphore chopstick[5]={1,1,1,1,1};
semaphore mutex=1;
Processi(){
  while(true){
    P(mutex);
    P(chopstick[i]);//锁上左边的筷子
    P(chopstick[(i+1)%5]);//锁上右边的筷子
		V(mutex);
    吃饭;
    V(chopstick[i]);//锁上左边的筷子
    V(chopstick[(i+1)%5]);//锁上右边的筷子
  }
}

虽然解决了这个问题,但是依然还是可能会导致有人在两个筷子都在面前的时候无法吃上饭

posted @ 2025-09-29 15:59  是我,米老鼠  阅读(15)  评论(0)    收藏  举报