哲学家进餐问题

    先直接上代码

 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 }

     一位哲学家只有在两个邻居都没有进餐时才允许进入到进餐状态!

转载于:https://www.cnblogs.com/lovejin/p/4172676.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值