经典同步问题二——哲学家进餐问题
系列同步问题:
经典同步问题一——生产者和消费者问题
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);}
}
经典同步问题二——哲学家进餐问题相关推荐
- (王道408考研操作系统)第二章进程管理-第三节10:经典同步问题之哲学家进餐问题
本文接: (王道408考研操作系统)第二章进程管理-第三节6:经典同步问题之生产者与消费者问题 ((王道408考研操作系统)第二章进程管理-第三节7:经典同步问题之多生产者与多消费者问题 (王道408 ...
- 经典的同步/互斥问题—哲学家进餐
经典的同步/互斥问题-哲学家进餐 一.问题描述 设有五个哲学家共用一张圆桌,分别坐在周围的五张椅子上,在圆桌上有五个碗和五只筷子,他们的生活方式是交替地进行思考和进餐.平时,一个哲学家进行思考,饥饿时 ...
- 经典同步问题三——读者写者问题
系列同步问题: 经典同步问题一--生产者和消费者问题 https://blog.csdn.net/weixin_36465540/article/details/105560002 经典同步问题二-- ...
- 经典同步问题一——生产者和消费者问题
系列同步问题: 经典同步问题一--生产者和消费者问题 https://blog.csdn.net/weixin_36465540/article/details/105560002 经典同步问题二-- ...
- java 哲学家_Java哲学家进餐问题|多线程
Java实验三 多线程 哲学家进餐问题 5个哲学家共用一张圆桌,分别坐在周围的5张椅子上, 在圆桌上有5个碗和5只筷子(注意是5只筷子,不是5双), 碗和筷子交替排列.他们的生活方式是交替地进行思考( ...
- 操作系统 | PV操作七大经典问题 生产者消费者 读者写者 哲学家进餐 理发师理发睡觉 和尚打水 吸烟者 吃水果
一.生产者消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语:Bounded-buffer problem),是一个多线程同步问题的经典案 ...
- 操作系统 | OS 经典同步问题之生产者-消费者问题,哲学家进餐问题
小目录 1. 生产者-消费者问题 2. 哲学家进餐问题 3. 吸烟者问题 1. 生产者-消费者问题 生产者消费者问题(英语:Producer-consumer problem),也称有限缓冲问题(英语 ...
- 操作系统(四) | 经典进程的同步问题(生产者--消费者问题、哲学家进餐问题、读者--写者问题)
文章目录 生产者--消费者问题 分析 实现 哲学家进餐问题 方法一:最多4人同时拿左筷子,最终保证一人能进餐 方法二:同时给左右筷子 解法1:AND信号量 解法2:信号量保护机制 方法三:让奇数先左后 ...
- 操作系统学习笔记(13) 互斥与同步的经典问题 -哲学家进餐问题
1 哲学家进餐问题: 2 (算法)信号量方法: 3 //Program diningphilosophers 4 var fork:array[5] of semaphor ...
最新文章
- latex下载对一篇文章的引用(.bib格式)
- 定向输出命令_Linux系统管理-输入输出
- ffmpeg for android windows,windows10下编译ffmpeg for android
- Java 8 - 收集器Collectors
- OpenCV学习笔记(九): 漫水填充:floodFill()
- Intel刚刚收购的Vertex.AI,到底有什么黑科技?
- python pywinauto 单击鼠标_Python释放你的双手去成就梦想之自动化控制鼠标键盘
- 移动Web界面样式-CSS3
- 图像下方出现几像素的空白间隙
- 昨天又发火了:领导拒不给他人安排工作
- uni-app调用百度OCR身份证识别的api,实现身份证文字识别
- Rufus --工具制作镜像
- Scanport(转来备用,在那小子以后攻击我的时候用)
- 用20 ETH的成本撬动3000万美元收益——Harvest攻击全复盘
- ubuntu(17):ubuntu下wps缺失字体百度网盘永久链接与安装方法
- Mini主机安装Ubuntu18.04记录
- Docker 书籍在线阅读(Docker 从入门到实践)
- 前端---js中onmouseover和onmouseout事件
- 民航飞机因何频繁遭遇乱流?
- 读书百客:《题竹林寺》简析
热门文章
- matlab求两向量夹角_高等数学之向量代数与空间解析几何知识点与题型总结
- SpringBoot-@ConfigurationProperties注解
- 403 forbidden nginx_5,Logstash正则提取Nginx日志 - pwcc
- python w3cschool_学习Python必去的8个网站
- anaconda moviepy_002从零开始学Python—Anaconda下载与安装
- GnuPG 的PGP使用
- Python相关网站(持续更新)
- Android 内部存储安装apk文件实现
- 微软BI 之SSIS 系列 - 理解Data Flow Task 中的同步与异步, 阻塞,半阻塞和全阻塞以及Buffer 缓存概念...
- LeetCode(892)——三维形体的表面积(JavaScript)