首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

哲学家进餐有关问题

2012-07-29 
哲学家进餐问题?#define N 5/*哲学家数目*/#define LEFT (i-1+N)%N/*i的左邻号码*/#define RIGHT (i+1)%N/

哲学家进餐问题

哲学家进餐有关问题

?

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

?

热点排行