C Semaphores DeadLock条件

时间:2014-01-28 17:22:33

标签: c posix semaphore

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

我们必须纠正它,因此它没有死锁但我不知道如何。

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
} 

4 个答案:

答案 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编写的,但这些想法非常重要。