哲学家就餐问题

huangyuf 转自http://www.exam100.com/bbs

有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子
#define  N  5
 void philosopher (int i)  
{
    while (true)  
   {
    思考;
    取fork[i]; 取fork[(i+1) % 5];
    进食;
    放fork[i]; 放fork[(i+1) % 5];
    }
}
为防止死锁发生可采取的措施:
最多允许4个哲学家同时坐在桌子周围仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子()给所有哲学家编号,奇数号的哲学家必须首先拿左边的筷子,偶数号的哲学家则反之 为了避免死锁,把哲学家分为三种状态,思考,饥饿,进食,并且一次拿到两只筷子,否则不拿.

 

哲学家就餐问题解法(1)
#define  N  5
 void philosopher (int i)  
{
    while (true)  
   {
    思考;
    取fork[i]; 取fork[(i+1) % 5];
    进食;
    放fork[i]; 放fork[(i+1) % 5];
    }
}
哲学家就餐问题解法(2)
#define  N  5
#define  THINKING  0
#define  HUNGRY    1
#define  EATING    2
#typedef  int semaphore;
int state[N];
semaphore mutex=1;
semaphore s[N];
void test(int i)
{
      if (state[ i ] == HUNGRY) 
          && (state [ (i-1) % 5] != EATING) 
          && (state [ (i+1) % 5] != EATING)
          {
               state[ i ] = EATING;
               V(&s[ i ]);
           }
 }
void  philosopher (int i) 
{   while (true)  
     {
      思考;
       P(&mutex);
       state[i] = HUNGRY;
       test(i);
       V(&mutex);
       P(&s[i]);
      拿左筷子;
      拿右筷子;
       进食;
      放左筷子;
      放右筷子;
        P(&mutex)
        state[ i ] = THINKING;
        test([i-1] % 5);
        test([i+1] % 5);
        V(&mutex);
        }
}
state[ i ] = THINKING
s[ i ] = 0