读书人

哲学家进餐有关问题

发布时间: 2012-07-29 15:26:13 作者: rapoo

哲学家进餐问题

哲学家进餐有关问题

?

#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]);}}
?

?

读书人网 >操作系统

热点推荐