这是去年考试中出现的“哲学家晚餐”问题。

我们必须对其进行纠正,以确保它没有死锁,但我不知道如何。

sem_t *chopstick[5];
/* .....initialize semaphores .....*/
while (true) {
  sem_wait ( chopstick[i] );
  sem_wait ( chopstick[ (i + 1) % 5] );
  // eats
  sem_post ( chopstick[i] );
  sem_post (chopstick[ (i + 1) % 5] );
  // Thinks
}

最佳答案

预防死锁的一种非常简单的解决方案是,最后一位哲学家以相反的顺序拿起筷子。在最坏的情况下,它的工作方式是:如果每个人同时拿起第一把筷子,而一个人只能吃饭,那么我们的哲学家3或4(哲学家的范围从0到N-1),具体取决于谁被称为下一个(哲学家0,1,2被阻止)。您还应该尝试创建方案以更好地理解。

#define N 5
sem_t *chopstick[N] = {1};

while (true) {
if( i != N )
{
   sem_wait ( chopstick[i] );                          //left
   sem_wait ( chopstick[ (i + 1) % N] );               //right
}
else
{
   sem_wait ( chopstick[0] );                         //right
   sem_wait ( chopstick[i] );                         //left
}
// eats

sem_post ( chopstick[i] );                             //it doesn't matter on order
sem_post (chopstick[ (i + 1) % N] );

// Thinks
}

10-07 15:56