场景:5个哲学家,5根筷子,5盘意大利面(意大利面很滑,需要同时两根筷子才能夹起来)大家围绕桌子,进行思考与进食的活到,如下图所示。

哲学家的活动描述:

哲学家除了吃面,还要思考,所以要么放下左右手筷子进行思考,要么拿起两根筷子开始吃饭(哲学家只能拿自己两侧的筷子吃面,不考虑卫生问题,要不两侧的都拿起来吃面,要么就不拿,处于思考状态。吃面和思考其实是交替进行的)。

如何安排哲学家们一致的行动逻辑,保证他们至少有人且尽可能两个人能同时拿到两把叉子开始吃饭,而不会发生“死锁”,“饥饿”,“干等”的状态。这是我们需要考虑的问题。

  • 死锁:大家都同时想吃饭,结果同时拿起左手边叉子,发现同时右边没有叉子,然后各怀私心,僵持者希望有人能放下他左手边叉子,然后抢夺之,开始吃意大利面,结果大家都没放。。。

  • 饥饿:大家都同时想吃饭,结果同时拿起左手边叉子,发现同时5个人右边都没有叉子,然后都很慷慨,结果大家同时放下左手边叉子,然后大家发现有叉子了,又同时开始拿起左手边叉子,又同时放下,如此反复。。。

  • 干等:假设想拿叉子这个想法的产生是一个“原子”操作,即不可同时发生,不可中断,然后一旦有人想拿,就进化为X教授,然后用能力控制了其他人处于僵化状态,然后开始独享,独享完后放下叉子想思考了,立即丧失超能力,于是其余四人回归正常,然后5人中再次有人想拿叉子,进化为教授,周而复始。但是这样,尼玛一个人吃,其余四个干看着啊。。怎么说也有5把叉子,5盘意大利面,至多可以两个人同时吃的。

怎样有比较好的、公平的方法解决哲学家吃意大利面的问题呢?

解决方法:

方法一:

至多只允许四位哲学家同时去拿左筷子,最终能保证至少有一位哲学家能进餐,并在用完后释放两只筷子供他人使用。

设置一个初值为 4 的信号量 r,只允许 4 个哲学家同时去拿左筷子,这样就能保证至少有一个哲学家可以就餐,不会出现饿死和死锁的现象。

原理:至多只允许四个哲学家同时进餐,以保证至少有一个哲学家能够进餐,最终总会释放出他所使用过的两支筷子,从而可使更多的哲学家进餐。

方法二:

定奇数号哲学家先拿左筷子再拿右筷子,而偶数号哲学家相反。

原理:按照下图,将是 2,3 号哲学家竞争 3 号筷子,4,5 号哲学家竞争 5 号筷子。1 号哲学家不需要竞争。最后总会有一个哲学家能获得两支筷子而进餐。

哲学家就餐问题学习笔记相关推荐

  1. Java多线程学习四十二:有哪些解决死锁问题的策略和哲学家就餐问题

    线上发生死锁应该怎么办 如果线上环境发生了死锁,那么其实不良后果就已经造成了,修复死锁的最好时机在于"防患于未然",而不是事后补救.就好比发生火灾时,一旦着了大火,想要不造成损失去 ...

  2. 【操作系统/OS笔记14】经典同步问题:读者-写者问题、哲学家就餐问题

    本次笔记内容: 10.6 经典同步问题-1 10.7 经典同步问题-2 10.8 经典同步问题-3 10.9 经典同步问题-4 10.10 经典同步问题-5 10.11 经典同步问题-6 文章目录 读 ...

  3. Java基础学习之并发篇:哲学家就餐问题

    学习目标 哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步时产生的问题.在1971年,著名的计算机科学家艾兹格·迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份 ...

  4. 学习笔记:Java 并发编程②_管程

    若文章内容或图片失效,请留言反馈. 部分素材来自网络,若不小心影响到您的利益,请联系博主删除. 视频链接:https://www.bilibili.com/video/av81461839 配套资料: ...

  5. Java学习笔记22:并发(2)

    Java学习笔记22:并发(2) 图源:PHP中文网 终止任务 终止线程有一种非常简单的方式:设置一个多线程共享的标记位,子线程用轮询的方式检查这个标记位,如果该标记位显示取消状态,就让子线程退出执行 ...

  6. 知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别

    知识图谱·概念与技术--第1章学习笔记--知识图谱概述--知识图谱的概念,与传统语义网络的区别 知识图谱的概念,与传统语义网络的区别 狭义概念 作为语义网络的内涵 与传统语义网络的区别 优点 缺点 与 ...

  7. 【Java】函数式编程学习笔记——Stream流

    学习视频:https://www.bilibili.com/video/BV1Gh41187uR?p=1 (1)[Java]函数式编程学习笔记--Lambda表达式 (2)[Java]函数式编程学习笔 ...

  8. 初级Java学习笔记总结

    java高并发解决方案:     1.页面静态:静态访问消耗的资源少             信息录入然后生成静态页面以供访问     2.数据库集群和库表散列             主-从数据库关 ...

  9. Java张孝祥视频 学习笔记 多线程

    /*************************************************************************************/ 此博客主要是在观看张孝祥 ...

最新文章

  1. python随机画散点图-python散点图实例之随机漫步
  2. 【转】gif文件格式详解
  3. 开放网络的承诺:它真的做到了吗?
  4. 【Linux】一步一步学Linux——ypdomainname命令(173)
  5. HDU 2255 二分图最佳匹配 模板题
  6. MOCTF-Web-还是水题
  7. JS 客户端浏览器操作、BOM、渗透客户端浏览器(windows对象:screen屏幕操作、location浏览器域名、history浏览器历史、Navigator浏览器信息、cookie)
  8. aspnetcore的中间件
  9. python制作一个简单的udp聊天器
  10. 查询端口号是否被占用指令
  11. Boot.ini无解
  12. nettry 入站事件如何传递到下一个handler
  13. mysql 触发器 new.id_mysql 触发器 new.id
  14. 80端口攻击_使用 ZoomEye 寻找 APT 攻击的蛛丝马迹
  15. Visual Studio——使用多字节字符集与使用Unicode字符集
  16. blos硬盘启动台式计算机,最新戴尔台式机bios设置硬盘启动图解
  17. 从0开始的TypeScriptの八:类
  18. 面对这些可能出现的意外,你的运维团队准备好了吗?
  19. 虚拟机硬盘格式的选择:qcow2、 raw等
  20. vue实现抽奖大转盘

热门文章

  1. 微信小程序 nodejs+vue+uniapp付费自习室图书馆教室座位系统-
  2. python:实现八进制转十进制算法(附完整源码)
  3. Linux下的IO port, IO mem, IO space, Mem space及访问方式
  4. 清北学堂北京大学文宏宇神仙讲课day7
  5. html5 小车动画_9款非常有意思的HTML5动画推荐
  6. J-Link 版本与仿真器版本
  7. 编程里的“代练”程序
  8. Glossary - 术语对照表 2
  9. 交强险赔偿范围和金额
  10. Python学习的第一个例子,用print语句打印一个皮卡丘。