哲学家就餐问题

场景:5个哲学家,5把叉子,5盘意大利面(意大利面很滑,需要两把叉子才能拿起)大家围绕桌子,进行思考与进食的活到,如下图所示。

哲学家的活动方式为:要么放下左右手刀叉进行思考,要么拿起刀叉开始吃饭(刀叉拿起时,必须拿两把,而且只能左右手依次拿,先左手拿左边,后右手拿右边,或者先右手拿右边,左边拿左边)。其只有这两种交替状态。

//描述每个哲学家的状态
#define N        5        //哲学家个数
#define LEFT  (i+N-1)%N   //第i个哲学家的左邻居
#define RIGHT (i+1)%N     //第i个哲学家的右邻居
#define THINKING 0        //思考状态
#define HUNGRY   1        //饥饿状态
#define EAT      2        //进餐状态
int state[N];             //记录每个人状态

//
semaphore mutex = 1;       //互斥信号量,初值1

//一个哲学家吃饱后,可能要唤醒邻居,存在同步关系
semaphore s[N] = {0};        //同步信号量,初值0


void philosopher(int i)
{
  while(true)
  {
  think();
  take_forks(i);
  eat();
  put_forks(i);
  }
}


void take_forks(int i);
{
  P(mutex);                         //进入临界区
  state[i]=HUNGRY;                  //设置状态,饿了
  test_take_left_right_forks(i);    //试图获取两把叉子
  V(mutex);                         //退出临界区
  P(s[i]);                          //没有叉子便阻塞
}

void put_forks(int i);
{
  P(mutex);                         //进入临界区
  state[i]=THINKING;
  test_take_left_right_forks(LEFT); //左邻居是否可以进餐
  test_take_left_right_forks(RIGHT);//右邻居是否可以进餐
  V(mutex);                         //退出临界区
}

void test_take_left_right_forks(int i)
{
  if(state[i]  == HUNGRY &&
    state[LEFT] != EAT &&
    state[RIGHT] != EAT)
  {
    state[i]=EAT;                  //两把叉子获得了
    V(s[i]);                       //通知第i号哲学家可以吃饭了
  }
}

void think(int i)
{
}
void eat(int i)
{
}

 

posted on 2022-01-08 14:45  BraveMrFeng  阅读(91)  评论(0)    收藏  举报

导航