#define N 5 /*哲学家数目*/ #define LEFT (i-1+N)%N /*i的左邻号码*/ #define RIGHT (i+1)%N /*i的右邻号码*/ #define THINKING 0 /*哲学家正在思考*/ #define HUNGRY 1 /*哲学家想取得叉子*/ #define EATING 2 /*哲学家正在吃面*/ typedef int semaphore; /*信号量是一个特殊的整型变量*/ int state[N]; /*记录每个人状态的数组*/ semaphore mutex = 1; /*临界区互斥*/ semaphore s[N]; /*每个哲学家一个信号量*/ void philosopher(int i) { /*i:哲学家号码,从0到N-1*/ while(TURE) { /*无限循环*/ think(); /*哲学家正在思考*/ take_forks(i); /*需要两只叉子,或者阻塞*/ eat(); /*进餐*/ put_forks(i); /*把两把叉子同时放回桌子*/ } } void take_forks(int i) { /*i:哲学家号码,从0到N-1*/ down(&mutex); /*进入临界区*/ state[i] = HUNGRY; /*记录下哲学家i饥饿的事实*/ test(i); /*试图得到两只叉子*/ up(&mutex); /*离开临界区*/ down(&s[i]); /*如果得不到叉子就阻塞*/ } void put_forks(int i) { /*i:哲学家号码,从0到N-1*/ down(&mutex); /*进入临界区*/ state[i] = THINKING; /*哲学家进餐结束*/ test(LEFT); /*看一下左邻居现在是否能进餐*/ test(RIGHT); /*看一下右邻居现在是否能进餐*/ up(&mutex); /*离开临界区*/ } void test(i) { /*i:哲学家号码,从0到N-1*/ if(state[i] == HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) { state[i] = EATING; up(&s[i]); } }