系列同步问题:
经典同步问题一——生产者和消费者问题
https://blog.csdn.net/weixin_36465540/article/details/105560002
经典同步问题二——哲学家进餐问题
https://blog.csdn.net/weixin_36465540/article/details/105564907
经典同步问题三——读者写者问题
https://blog.csdn.net/weixin_36465540/article/details/105565495

哲学家进餐问题

问题描述

五个哲学家住在一起,每个人的生活由吃饭思考组成。饭桌上有一盘菜,五个人每个人一个盘子一支叉子。想吃饭的哲学家会到桌子边的位置上,拿起左、右两个叉子,从中间的盘子中取菜放到自己的盘子中。
条件:防止叉子互斥使用;防止死锁和饥饿。

解决方案一


给哲学家和叉子分别从0到4标号,0号哲学家吃饭时需要0和1号叉子,1号哲学家需要1和2号叉子……4号哲学家需要4和0号叉子。即 i 号哲学家需要 i 和 (i+1)%5 号叉子。由于叉子是互斥使用的,故我们为每个叉子设置一个信号量。这里可以设置一个长度为5的信号量数组,用下标表示叉子的编号。解决互斥问题,故初值都设为1。
缺点:5个哲学家都坐在座位上顺次拿起自己左边的叉子,即都执行了wait(fork[i]),那么他们的下一步操作即wait(fork[(i+1)%5])都会使进程进入等待状态,由于都无法执行到signal释放临界区,故发生死锁。

Semaphore fork[5] = { 1 };
int i;
void philosopher(int i) {while (true) {think();wait(fork[i]);wait(fork[(i+1)%5]);eat();signal(fork[(i+1)%5]);signal(fork[i]);}
}

解决方案二

通过限制进餐人数防止死锁问题,最多可以有N-1个人,即人数要比座位数少1。具体方法为添加一个信号量room.value,控制人数。

Semaphore room.value = 4;
Semaphore fork[5] = { 1 };
int i;
void philosopher(int i) {while (true) {think();wait(room);wait(fork[i]);wait(fork[(i+1)%5]);eat();signal(fork[(i+1)%5]);signal(fork[i]);signal(room);}
}

经典同步问题二——哲学家进餐问题相关推荐

  1. (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题

    本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...

  2. 经典的同步/互斥问题—哲学家进餐

    经典的同步/互斥问题-哲学家进餐 一.问题描述 设有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐.平时,一个哲学家进行思考,饥饿时 ...

  3. 经典同步问题三——读者写者问题

    系列同步问题: 经典同步问题一--生产者和消费者问题 https://blog.csdn.net/weixin_36465540/article/details/105560002 经典同步问题二-- ...

  4. 经典同步问题一——生产者和消费者问题

    系列同步问题: 经典同步问题一--生产者和消费者问题 https://blog.csdn.net/weixin_36465540/article/details/105560002 经典同步问题二-- ...

  5. java 哲学家_Java哲学家进餐问题|多线程

    Java实验三 多线程 哲学家进餐问题 5个哲学家共用一张圆桌,分别坐在周围的5张椅子上, 在圆桌上有5个碗和5只筷子(注意是5只筷子,不是5双), 碗和筷子交替排列.他们的生活方式是交替地进行思考( ...

  6. 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果

    一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...

  7. 操作系统 | OS 经典同步问题之生产者-消费者问题,哲学家进餐问题

    小目录 1. 生产者-消费者问题 2. 哲学家进餐问题 3. 吸烟者问题 1. 生产者-消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语 ...

  8. 操作系统(四) | 经典进程的同步问题(生产者--消费者问题、哲学家进餐问题、读者--写者问题)

    文章目录 生产者--消费者问题 分析 实现 哲学家进餐问题 方法一:最多4人同时拿左筷子,最终保证一人能进餐 方法二:同时给左右筷子 解法1:AND信号量 解法2:信号量保护机制 方法三:让奇数先左后 ...

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

    1 哲学家进餐问题:   2 (算法)信号量方法:   3     //Program diningphilosophers   4     var fork:array[5] of semaphor ...

最新文章

  1. latex下载对一篇文章的引用(.bib格式)
  2. 定向输出命令_Linux系统管理-输入输出
  3. ffmpeg for android windows,windows10下编译ffmpeg for android
  4. Java 8 - 收集器Collectors
  5. OpenCV学习笔记(九): 漫水填充:floodFill()
  6. Intel刚刚收购的Vertex.AI,到底有什么黑科技?
  7. python pywinauto 单击鼠标_Python释放你的双手去成就梦想之自动化控制鼠标键盘
  8. 移动Web界面样式-CSS3
  9. 图像下方出现几像素的空白间隙
  10. 昨天又发火了:领导拒不给他人安排工作
  11. uni-app调用百度OCR身份证识别的api,实现身份证文字识别
  12. Rufus --工具制作镜像
  13. Scanport(转来备用,在那小子以后攻击我的时候用)
  14. 用20 ETH的成本撬动3000万美元收益——Harvest攻击全复盘
  15. ubuntu(17):ubuntu下wps缺失字体百度网盘永久链接与安装方法
  16. Mini主机安装Ubuntu18.04记录
  17. Docker 书籍在线阅读(Docker 从入门到实践)
  18. 前端---js中onmouseover和onmouseout事件
  19. 民航飞机因何频繁遭遇乱流?
  20. 读书百客:《题竹林寺》简析

热门文章

  1. matlab求两向量夹角_高等数学之向量代数与空间解析几何知识点与题型总结
  2. SpringBoot-@ConfigurationProperties注解
  3. 403 forbidden nginx_5,Logstash正则提取Nginx日志 - pwcc
  4. python w3cschool_学习Python必去的8个网站
  5. anaconda moviepy_002从零开始学Python—Anaconda下载与安装
  6. GnuPG 的PGP使用
  7. Python相关网站(持续更新)
  8. Android 内部存储安装apk文件实现
  9. 微软BI 之SSIS 系列 - 理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念...
  10. LeetCode(892)——三维形体的表面积(JavaScript)