哲学家就餐问题的三种避免死锁的解法(PV操作)
哲学家就餐问题的三种避免死锁的解法(PV操作)
方案一:最多允许有四位哲学家同时去拿左边的筷子,然后再拿右边的筷子,最终保证至少有一位哲学家能够进餐,并在就餐完毕时同时释放他用过的两只筷子,从而使更多的哲学家能够进餐
semaphore mutex[5] = {1,1,1,1,1}; //初始化信号量
semaphore count = 4; //控制最多允许四位哲学家同时进餐void philosopher(int i){do {//thinking //思考p(count); //判断是否超过四人准备进餐P(mutex[i]); //判断缓冲池中是否仍有空闲的缓冲区P(mutex[(i+1)%5]);//判断是否可以进入临界区(操作缓冲池)//...//eat //进餐//...V(mutex[i]);//退出临界区,允许别的进程操作缓冲池V(mutex[(i+1)%5]);//缓冲池中非空的缓冲区数量加1,可以唤醒等待的消费者进程V(count);//用餐完毕,别的哲学家可以开始进餐}while(true);
}
方案二:当哲学家的左,右两只筷子均可用时,才允许他拿起筷子进餐
semaphore mutex[5] = {1,1,1,1,1}; //初始化信号量void philosopher(int i){do {//thinking //思考Swait(mutex[i], mutex[(i+1)%5]);//判断哲学家左边和右边的筷子是否同时可用//...//eat //...Ssignal(mutex[i], mutex[(i+1)%5]);//进餐完毕,释放哲学家占有的筷子}while(true);
}
方案三:规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则先拿起他右边的筷子,然后再去拿他左边的筷子,此时需要在代码中添加个判断,来决定获取左、右筷子的顺序
semaphore mutex[5] = {1,1,1,1,1}; //初始化信号量void philosopher(int i){do {//thinking if(i%2 == 1){P(mutex[i]);//判断哲学家左边的筷子是否可用P(mutex[(i+1)%5]);//判断哲学家右边的筷子是否可用}else{P(mutex[(i+1)%5]);//判断哲学家右边的筷子是否可用P(mutex[i]);//判断哲学家左边的筷子是否可用}//...//eat//...V(mutex[i]);//退出临界区,允许别的进程操作缓冲池V(mutex[(i+1)%5]);//缓冲池中非空的缓冲区数量加1,可以唤醒等待的消费者进程}while(true);
}
哲学家就餐问题的三种避免死锁的解法(PV操作)相关推荐
- 【Tools】VMware虚拟机三种网络模式详解和操作
00. 目录 文章目录 00. 目录 01. VMware虚拟机三种网络模式 02. Bridged(桥接模式) 03. NAT(地址转换模式) 04. Host-Only(仅主机模式) 05. 参考 ...
- 哲学家就餐问题c语言_哲学家就餐问题的一种Python解决方案
哲学家就餐问题一直是多线程同步问题的经典案例,本文中展示了多线程竞争共享资源带来的死锁问题,并介绍了一种简单的解决方案. 哲学家就餐问题 哲学家最擅长的就是思考和吃饭 ,当他们感觉累的时候,就会拿起一 ...
- CPU被夺走的三种状态 执行时间久了 IO操作让cpu等待 被优先级高的抢占
CPU被夺走的三种状态 . cpu的三种状态之 运行态 就绪态等待被调用 阻塞态 i ...
- linux su root 免密码,Ubuntu 18.04.2切换到root用户的三种方式及设置免密码操作
本文介绍在Ubuntu 18.04.2系统中切换root用户的三种方式及在Ubuntu 18.04.2系统中设置普通用户切换root用户免密码操作. Ubuntu 18.04.2系统中切换root用户 ...
- 哲学家进餐问题三种解决死锁问题
方案一 至多允许有四位哲学家同时去拿左边的筷子,然后在允许拿右边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能同时释放他用过的两只筷子,从而使更多的哲学家能够进餐 semaphore cho ...
- 哲学家就餐与死锁问题,死锁产生的条件以及解决方案
请结合经典案例-哲学家就餐,来谈谈你对死锁的理解,以及怎么预防和解除死锁? 哲学家就餐 描述:在一张圆桌上,有n个哲学家,n支筷子,他们的生活方式只是交替地进行思考和进餐,饥饿时便试图取其左.右最靠近 ...
- android启动其他app的服务器,Android中通过外部程序启动App的三种方法
这篇文章主要介绍了Android中通过外部程序启动App的三种方法, 本文讲解了直接通过包名. 通过自定义的Action. 通过Scheme三种方法,并分别给出操作代码,需要的朋友可以参考下 ==== ...
- 怎么把线稿提取出来_PS教程:提取线稿如此简单?三种方法总有一种适合你
原标题:PS教程:提取线稿如此简单?三种方法总有一种适合你 部落窝教育,每天学习PS独家原创视频 在PS出现之前,如果我们喜欢某个动漫角色大概只能通过临摹的方式将人物线条勾勒出来,但PS的出现将提取线 ...
- Spark Streaming三种运行场景
三种运行场景描述 无状态操作 有状态操作 updateStateByKey window 场景一(无状态操作)描述: 对于无状态操作,每次操作都只是计算当前时间切片的内容,例如每次只计算一秒钟时间切片 ...
最新文章
- lvs十种调度策略+三种模式
- docker虚拟机动态扩展内存
- oracle之 11g RAC R2 体系结构---Grid
- 计算机网络(一)计算机网络概述、组成、功能分类、性能指标 | 思维导图
- mysql将大表定时转储_mysql数据库数据定时封装转储
- P5518-[MtOI2019]幽灵乐团【莫比乌斯反演,欧拉反演】
- 爬虫必备技能!开发者工具技巧总结
- linux内核那些事之ZONE
- clickhouse小结--数据类型及常见客户端类型
- 创业者都认为经营一家新公司最主要的目标是融资
- 蓝屏dump分析教程,附分析工具WinDbg
- 0x0000006B蓝屏问题解决方法
- Android 获取及修改屏幕亮度
- linux 连接远程3389,Linux下使用rdesktop连接Windows的3389
- 一个关于偷书贼的故事
- win7 iis php mysql_windows7和iis配置的php phpinfo()中没有mysql组件
- 程序员必备注释模板——“佛祖保佑 永无bug“
- 图像配准常用评价方法
- Linux下软件的安装与卸载(命令行模式)
- Unity教程初级Ruby‘s Adventure游戏实现带工程源码