哲学家问题的算法

发表于:2007-07-04来源:作者:点击数: 标签:
在c/c++论坛里看到有网友贴出来,这里做一下备份,以后有时间尝试一下能否用信号量与共享内存机制把程序编出来 #define N 5 #define LEFT (i-1)%N #define RIGHT (i+1)%N #define THINKING 0 #define HUNGRY 1 #define EATING 2 int state[N]; void philosopher
在c/c++论坛里看到有网友贴出来,这里做一下备份,以后有时间尝试一下能否用信号量与共享内存机制把程序编出来

#define N 5
#define LEFT (i-1)%N
#define RIGHT (i+1)%N
#define THINKING 0
#define HUNGRY 1
#define EATING 2
int state[N];

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


void take_forks(int i)
{
   down(&mutex);
   state[i]=HUNGRY;
   test(i);
   up(&mutex);
   down(&s[i]);
}


void put_forks(int i)
{
   down(&mutex);
   state[i]=THINKING;
   test(LEFT);
   test(RIGHT);
   up(&mutex);
}


void test(i)
{
   if(state[i]==HUNGRY && state[LEFT]!=EATING && state[RIGHT]!=EATING)
   {
       state[i]=EATING;
       up(&s[i]);
   }
}


原文转自:http://www.ltesting.net