哲学家进餐问题是这样子的:好几位哲学家围绕着餐桌坐,每一位哲学家要么思考,要么等待,要么就吃饭。为了吃饭,哲学家必须拿起两支筷子(分放于左右两端)。不幸的是,筷子的数量和哲学家相等,所以每支筷子必须由两位哲学家共享。图4-1 显现出这种状态。? FAQ 16:我如何避免死锁?

哲学家都是有点倔强的人,他们不愿意在吃完之前放下他们的筷子。因此,如果每位哲学家都抓住了左手边的筷子,他们就不可能抓到右手边的筷子,因为右边的哲学家正在使用那支筷子,而且拒绝出让。

在 SwapLists() 中所发生的死锁问题,是因为它必须等待两个critical section。哲学家的死锁问题则是因为他们都必须等待两支筷子。在程序之中我们必须要求操作系统给我们一点帮助,如critical sections 或其他什么东西。不幸的是,critical sections 没办法使用于这种情况。

这个问题也可以这样解决:使用一个 critical section 并允许一次只能够有一位哲学家拿起或放下筷子。这并不是最好的解决方法,因为它限制了哲学家的自由意志,同时也让他们做了非必要的等待。
还记得上一章最后提到的 WaitForMultipleObjects() 函数吗?它允许你对操作系统发出“等待”的要求,直到所有指定的对象都激发才返回。同一时我能够等待一个以上的critical sections 吗?刻取得两支筷子而非一支筷子,是本案的关键。但是 WaitForMultipleObjects()等待的只是核心对象,critical section 并不是核心对象(它没有 handle)。因此,我们必须寻求另一种 Win32 同步机制:mutex。

最新文章

  1. 【UI插件】简单的日历插件(下)—— 学习MVC思想
  2. [Linux] - Docker移动数据到其它盘的办法
  3. HTML中strong与b,em与i标签的区别
  4. Struts2(十三)国际化-internationalization
  5. uva 1421
  6. 从 IT 的角度思考 BIM(一):面向对象
  7. Haskell 输入和输出
  8. 用C#实现生成PDF文档
  9. ural2014 Zhenya moves from parents
  10. CSS -- 练习之制作简单商品图
  11. ASP.NET Core MVC和Visual Studio入门
  12. css3学习系列之选择器(一)
  13. 特殊计数序列——第一类斯特林(stirling)数
  14. label 的for属性总结
  15. 关于MySQL数据库——增删改查语句集锦
  16. 仿B站项目(3)页面配置
  17. 关于nodejs
  18. css布局之头尾固定中间高度自适应
  19. 如何用Client OM获取页面上一个Content web part的内容
  20. 利用security.js实现RSA加密

热门文章

  1. Apache与Tomcat的关系和区别 -个人比较
  2. 优雅的H5下拉刷新【minirefresh】
  3. mysql简单主从复制(二)
  4. Ubuntu14.04下搭建VPN服务 -pptp
  5. spi master接口的fpga实现
  6. centos6/7通用查看系统版本
  7. 集美大学网络1413第十五次作业成绩(团队十) -- 项目复审与事后分析(Beta版本)
  8. 201521123085《Java程序设计》第4周学习总结
  9. 201521123078 《Java程序设计》第11周学习总结
  10. 201521123045 《JAVA程序设计》第1周学习总结