标签:style blog color os sp for div 问题 log
先直接上代码
1 #define N 5 /* 哲学家数目 */ 2 #define LEFT (i+N-1)%N /* i的左邻编号 */ 3 #define RIGHT (i+ 1)%N /* i的右邻编号 */ 4 #define THINKING 0 /* 哲学家在思考 */ 5 #define HUNGRY 1 /*哲学家试图拿起叉子 */ 6 #define EATING 2 /* 哲学家进餐 */ 7 typedef int semaphore; /*信号量 */ 8 int state[N]; /*记录每位哲学家状态 */ 9 semaphore mutex = 1 ; /*临界区的互斥 */ 10 semaphore s[N]; /* 每位哲学家一个信号量 */ 11 12 void philosopher(int i) /* i: 哲学家编号, 从0到N-1 */ 13 { 14 while (TRUE) { /* 无限循环 */ 15 think(); /* 哲学家思考 */ 16 take_ forks(i); /* 测试叉子是否可用 */ 17 eat(); /* 哲学家进餐 */ 18 put_ forks(i); /* 将叉子放回到桌子上 */ 19 } 20 } 21 22 void take_forks(int i) 23 { 24 down(&mutex); /* 进入临界区 */ 25 state[i] = HUNGRY; /* 记录哲学家i处于饥饿状态 */ 26 test(i); /* 尝试获取两把叉子 */ 27 up(&mutex); /* 退出临界区 */ 28 down(&s[i]); /* 如果得不到需要的叉子则阻塞 */ 29 } 30 31 void put_forks(i) 32 { 33 down(&mutex); /* 进入临界区 */ 34 state[i] =THINKING; /* 哲学家进餐完毕 */ 35 test(LEFT); /* 测试左邻是否可以吃 */ 36 test( RIGHT); /* 测试右邻是否可以吃 */ 37 up(&mutex); /* 离开临界区 */ 38 } 39 40 void test(i)
41 { 42 if (state[i] ==HUNGRY && state[LEFT] != EATING && state[RIGHT] != EATING) { 43 state[i] = EATING; 44 up(&s[i]); 45 } 46 }
一位哲学家只有在两个邻居都没有进餐时才允许进入到进餐状态!
标签:style blog color os sp for div 问题 log
原文地址:http://www.cnblogs.com/lovejin/p/4172676.html