这是去年考试中出现的“哲学家晚餐”问题。
我们必须对其进行纠正,以确保它没有死锁,但我不知道如何。
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
}