java哲学家就餐_哲学家就餐问题的解决方案(三种)
方案一
至多允许有四位哲学家同时去拿左边的筷子,然后在允许拿右边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能同时释放他用过的两只筷子,从而使更多的哲学家能够进餐
semaphore chopstick[5] = {1,1,1,1,1};
semaphore num_mutex = 4;
while(wait(num_mutex))
{
wait(chopstick[i]);
wait(chopstick[(i+1)%5]);
// eat()
signal(chopstick[i]);
signal(chopstick[(i+1)%5]);
signal(num_mutex);
}
1
2
3
4
5
6
7
8
9
10
11
12
方案二
仅当哲学家的左,右两只筷子均可用时,才允许他拿起筷子进餐
semaphore chopstick[5] = {1,1,1,1,1}
do{
···
// think()
swait(chopstick[(i+1)%5],chopstick[i]);
//eat()
signal(chopstick[(i+1)%5],chopstick[i]);
}while(true)
1
2
3
4
5
6
7
8
9
10
11
方案三
规定奇数号的哲学家先拿起他左边的筷子,然后再去拿他右边的筷子;而偶数号的哲学家则先拿起他右边的筷子,然后再去拿他左边的筷子。按此规定,将是1、2号哲学家竞争1号筷子,3、4号哲学家竞争3号筷子。即五个哲学家都竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一个哲学家能获得两支筷子而进餐
semaphore chopstick[5]={1,1,1,1,1};
void philosopher(int i)
{
while(true)
{
think();
if(i%2 == 0) //偶数哲学家,先右后左。
{
wait (chopstick[(i + 1)%5]) ;
wait (chopstick[i]) ;
eat();
signal (chopstick[(i + 1)%5]) ;
signal (chopstick[i]) ;
}
else //奇数哲学家,先左后右。
{
wait (chopstick[i]) ;
wait (chopstick[(i + 1)%5]) ;
eat();
signal (chopstick[i]) ;
signal (chopstick[(i + 1)%5]) ;
}
}
}
java哲学家就餐_哲学家就餐问题的解决方案(三种)相关推荐
- java c3p0 配置文件_【c3p0】 C3P0的三种配置方式以及基本配置项详解
数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. ---------------------------------------- ...
- java解析遍历List集合(其实现子类)的三种方式
java解析遍历List集合(其实现子类)的三种方式 1 使用迭代器对象 1.1 底层 1.1.1 List接口继承了Collection接口 1.1.2 而Collection接口又继承了Itera ...
- python三大编程语言_程序员最需要的三种编程语言
随着科学技术的进步和新技术的进步,编程语言的种类越来越多,变化是程序员需要跟踪和学习许多语言 然而,有太多的语言无法一一掌握 在目前的形式中,最需要掌握的三种编程语言是 现在判断还不晚 坦白说,找工作 ...
- Hibernate学习笔记_核心幵发接口及三种对象状态
核心接口开发 (重点) 一, Configuration a) AnnotationConfi ...
- java 数组 源码_Java数组转List的三种方式及对比
来源:https://s.yam.com/6wu6n 前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析. 一.最常见方式(未必最佳 ...
- java .class 实例对象_Java产生Class类的三种实例化对象的方法
Java产生Class类的三种实例化对象的方法 1.object.getClass 2.类名.class直接根据某个具体的类来取得Class实例化对象 3.Class.forName(String c ...
- java 如何初始化数组_java中初始化数组的三种方式分别是什么
三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 3.默认初始化:创建之后若不赋值则会被赋对应数据类型的默认值 (视频教程推荐:java视频) 我们来看一下具体代码:publ ...
- mysql连接耗尽_避免数据库连接被耗尽的三种配置
避免数据库连接被耗尽的三种配置 中文社区 (MOSC) 中间件 (MOSC) 0 Replies Last updated on February 15, 2015 This question is ...
- java时间戳是什么类型_java 获取时间戳的三种方式
java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMill ...
- java获取小程序中用户的unionId的三种方式
前提条件: 想要获取unionId,必须几个小程序或者公众号在同一个主体之下,要不然没有unionId,只会生成用户的openid,可登陆下面这个微信官方平台查看 https://open.weixi ...
最新文章
- 自己写的一个tomcat发布脚本
- 用c语言 编写桌面应用程序,谁能帮我用C语言编写“动态桌面啊”!!!急呀!!!...
- 数组实现栈,实现push,pop,size方法 -- 面试算法
- PL/SQL developer执行的sql文件编码
- 【Machine Learning实验5】SVM实验
- Python Qt GUI快速编程第六章代码分析
- jQuery修改页面元素的属性
- 毕业五年的音视频开发工程师过得怎么样了?
- iis7php怎么301重定向,iis7/8设置网站301重定向的方法
- 微软官方上线 Python 教程
- 如何搭建视频点播服务
- 机器学习(周志华) 第七章贝叶斯分类器
- python 爬取整部漫画(简单的图片爬取)
- PE、PM、PD、PR分别是什么岗位?
- 软件实施整体方案之实施进度表
- RabbitMQ介绍和安装以及当下发展现状
- 网络渗透测试的概念以及作用
- oracle计算timestamp差,Oracle 计算timestamp和date类型的时间差
- Unity Excel转Json小工具excel2json
- JVM内存区域和垃圾收集器
热门文章
- uniapp 微信分享(安卓)
- 超过4G如何制作NTFS格式WINPE?
- matlab中拉式域转时间域,Bark域介绍和线性频率域转换到Bark域
- matlab 子波,基于Matlab的Bark子波实现
- 剧推|2019hulu原创剧集激情推荐!
- openstack创建的云主机不能访问外网,不能ping www.baidu.com
- DDCTF2018(╯°□°)╯︵ ┻━┻writeup
- 中国新能源汽车行业运作模式与供需形势分析报告2022版
- 闹市里的宁静一隅,乡村慢生活#观澜山水田园文化旅游园
- Python:设置不显示Using TensorFlow backend及FutureWarning: Passing (type, 1) or ‘1type‘ as a synonym of typ