码迷,mamicode.com
首页 > 其他好文 > 详细

哲学家进餐问题

时间:2014-12-18 22:05:59      阅读:243      评论:0      收藏:0      [点我收藏+]

标签: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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!