这是去年考试中出现的哲学家晚餐问题。
我们必须纠正它,因此它没有死锁但我不知道如何。
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
}
答案 0 :(得分:0)
我强烈建议您阅读solutions。
其中一个简单的方法是确保始终以特定顺序拾取货叉(资源层次结构解决方案)。
例如:
sem_t *chopstick[5];
/* .....initialise semaphores .....*/
while (true) {
if (i == 4) {
sem_wait ( chopstick[0] );
sem_wait ( chopstick[i] );
} else {
sem_wait ( chopstick[i] );
sem_wait ( chopstick[i + 1] );
}
// eats
sem_post ( chopstick[i] );
sem_post (chopstick[ (i + 1) % 5] );
// Thinks
}
答案 1 :(得分:0)
读完本书后
OPERATING 系统 CONCEPTS ABRAHAM SILBERSCHATZ
我意识到老师在第222页上使用了这本书来提出这个问题。
本书的其他解决方案是:
monitor DiningPhilosophers
{
enum { THINKING, HUNGRY, EATING } state[5];
condition self[5];
void pickup(int i) {
state[i] = HUNGRY;
test(i);
if (state[i] != EATING)
self[i].wait();
}
void putdown(int i) {
state[i] = THINKING;
test((i + 4) % 5);
test((i + 1) % 5);
}
void test(int i) {
if ((state[(i + 4) % 5] != EATING) &&(state[i] == HUNGRY) &&
(state[(i + 1) % 5] != EATING)) {
state[i] = EATING;
self[i].signal();
}
}
initialization code() {
for (int i = 0; i < 5; i++)
state[i] = THINKING;
}
}
答案 2 :(得分:0)
通过预防僵局做出的非常简单的解决办法是,最后一位哲学家以相反的顺序拿起筷子。在最坏的情况下这样做:如果每个人同时拿起第一根筷子而不是只有一只可以吃,在我们的案例中哲学家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
}
答案 3 :(得分:0)
如果你想真正了解同步内容,请查看Downey的"Little book of semaphores"。它是用Python编写的,但这些想法非常重要。