方案一

至多允许有四位哲学家同时去拿左边的筷子,然后在允许拿右边的筷子,最终能保证至少有一位哲学家能够进餐,并在用毕时能同时释放他用过的两只筷子,从而使更多的哲学家能够进餐

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哲学家就餐_哲学家就餐问题的解决方案(三种)相关推荐

  1. java c3p0 配置文件_【c3p0】 C3P0的三种配置方式以及基本配置项详解

    数据库连接池C3P0框架是个非常优异的开源jar,高性能的管理着数据源,这里只讨论程序本身负责数据源,不讨论容器管理. ---------------------------------------- ...

  2. java解析遍历List集合(其实现子类)的三种方式

    java解析遍历List集合(其实现子类)的三种方式 1 使用迭代器对象 1.1 底层 1.1.1 List接口继承了Collection接口 1.1.2 而Collection接口又继承了Itera ...

  3. python三大编程语言_程序员最需要的三种编程语言

    随着科学技术的进步和新技术的进步,编程语言的种类越来越多,变化是程序员需要跟踪和学习许多语言 然而,有太多的语言无法一一掌握 在目前的形式中,最需要掌握的三种编程语言是 现在判断还不晚 坦白说,找工作 ...

  4. Hibernate学习笔记_核心幵发接口及三种对象状态

    核心接口开发  (重点)                                                  一,  Configuration a)   AnnotationConfi ...

  5. java 数组 源码_Java数组转List的三种方式及对比

    来源:https://s.yam.com/6wu6n 前言: 本文介绍Java中数组转为List三种情况的优劣对比,以及应用场景的对比,以及程序员常犯的类型转换错误原因解析. 一.最常见方式(未必最佳 ...

  6. java .class 实例对象_Java产生Class类的三种实例化对象的方法

    Java产生Class类的三种实例化对象的方法 1.object.getClass 2.类名.class直接根据某个具体的类来取得Class实例化对象 3.Class.forName(String c ...

  7. java 如何初始化数组_java中初始化数组的三种方式分别是什么

    三种初始化方式: 1.静态初始化:创建+赋值 2.动态初始化:先创建再赋值 3.默认初始化:创建之后若不赋值则会被赋对应数据类型的默认值 (视频教程推荐:java视频) 我们来看一下具体代码:publ ...

  8. mysql连接耗尽_避免数据库连接被耗尽的三种配置

    避免数据库连接被耗尽的三种配置 中文社区 (MOSC) 中间件 (MOSC) 0 Replies Last updated on February 15, 2015 This question is ...

  9. java时间戳是什么类型_java 获取时间戳的三种方式

    java 获取时间戳的三种方式 CreationTime--2018年7月13日16点29分 Author:Marydon 1.实现方式 方式一:推荐使用 System.currentTimeMill ...

  10. java获取小程序中用户的unionId的三种方式

    前提条件: 想要获取unionId,必须几个小程序或者公众号在同一个主体之下,要不然没有unionId,只会生成用户的openid,可登陆下面这个微信官方平台查看 https://open.weixi ...

最新文章

  1. 自己写的一个tomcat发布脚本
  2. 用c语言 编写桌面应用程序,谁能帮我用C语言编写“动态桌面啊”!!!急呀!!!...
  3. 数组实现栈,实现push,pop,size方法 -- 面试算法
  4. PL/SQL developer执行的sql文件编码
  5. 【Machine Learning实验5】SVM实验
  6. Python Qt GUI快速编程第六章代码分析
  7. jQuery修改页面元素的属性
  8. 毕业五年的音视频开发工程师过得怎么样了?
  9. iis7php怎么301重定向,iis7/8设置网站301重定向的方法
  10. 微软官方上线 Python 教程
  11. 如何搭建视频点播服务
  12. 机器学习(周志华) 第七章贝叶斯分类器
  13. python 爬取整部漫画(简单的图片爬取)
  14. PE、PM、PD、PR分别是什么岗位?
  15. 软件实施整体方案之实施进度表
  16. RabbitMQ介绍和安装以及当下发展现状
  17. 网络渗透测试的概念以及作用
  18. oracle计算timestamp差,Oracle 计算timestamp和date类型的时间差
  19. Unity Excel转Json小工具excel2json
  20. JVM内存区域和垃圾收集器

热门文章

  1. uniapp 微信分享(安卓)
  2. 超过4G如何制作NTFS格式WINPE?
  3. matlab中拉式域转时间域,Bark域介绍和线性频率域转换到Bark域
  4. matlab 子波,基于Matlab的Bark子波实现
  5. 剧推|2019hulu原创剧集激情推荐!
  6. openstack创建的云主机不能访问外网,不能ping www.baidu.com
  7. DDCTF2018(╯°□°)╯︵ ┻━┻writeup
  8. 中国新能源汽车行业运作模式与供需形势分析报告2022版
  9. 闹市里的宁静一隅,乡村慢生活#观澜山水田园文化旅游园
  10. Python:设置不显示Using TensorFlow backend及FutureWarning: Passing (type, 1) or ‘1type‘ as a synonym of typ