操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题

  1 哲学家进餐问题:
  2 (算法)信号量方法:
  3     //Program diningphilosophers
  4     var fork:array[5] of semaphore = 1;
  5     int i;
  6
  7     procedure philosopher(int i){
  8         while(true){
  9             think;
 10             wait(fork[i]);
 11             wait(fork[(i+1)%5]);
 12             eat();
 13             siganl(fork[(i+1)%5]);
 14             signal(fork[i]);
 15         }
 16     }
 17
 18     main(){
 19         philosopher(0);
 20         philosopher(1);
 21         philosopher(2);
 22         philosopher(3);
 23         philosopher(4);
 24     }
 25
 26     哲学家只能竞争左右两只筷子。
 27     可能会出现死锁现象:
 28
 29     改进方案:(增加一个资源)
 30     //Program diningphilosophers
 31     var fork:array[5] of semaphore = 1;
 32     int i;
 33     var room :semaphore = 4;
 34    
 35     procedure philosopher(int i){
 36         while(true){
 37             think;
 38             wait(room);
 39             wait(fork[i]);
 40             wait(fork[(i+1)%5]);
 41             eat();
 42             siganl(fork[(i+1)%5]);
 43             signal(fork[i]);
 44             signal(room);
 45         }
 46     }
 47
 48     main(){
 49         philosopher(0);
 50         philosopher(1);
 51         philosopher(2);
 52         philosopher(3);
 53         philosopher(4);
 54     }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值