1 描述

一张圆桌上坐着5名哲学家,每两个哲学家之间的桌上摆一根筷子,桌子的中间是一碗米饭,如图所示。哲学家们倾注毕生精力用于思考和进餐,哲学家在思考时,并不影响他人。只有当哲学家饥饿的时候,才试图拿起左、右两根筷子(一根一根地拿起)。如果筷子已在他人手上,则需等待。饥饿的哲学家只有同时拿到了两根筷子才可以开始进餐,当进餐完毕后,放下筷子继续思考。

2 分析

关系分析。 5名哲学家与左右邻居对其中间筷子的访问是互斥关系。

整理思路。 显然这里有五个进程。本题的关键是如何让一个哲学家拿到左右两个筷子而不造成死锁或者饥饿现象。那么解决方法有两个,一个是让他们同时拿两个筷子;二是对每个哲学家的动作制定规则,避免饥饿或者死锁现象的发生。

信号量设置。 定义互斥信号量数组Ch0PstiCk[5] = {l, 1, 1, 1, 1}用于对5个筷子的互斥访问。对哲学家按顺序从0~4编号,哲学家i左边的筷子的编号为i,哲学家右边的筷子的编号为(i+l)%5。

semaphore chopstick[5] = {1,1,1,1,1}; //定义信号量数组chopstick[5],并初始化

Pi(){ //i号哲学家的进程

while(1){

P(chopstick[i]); //取左边筷子

P(chopstick[(i+1)%5]); //取右边篌子

eat;

V(chopstick[i]); //放回左边筷子

V(chopstick[(i+1)%5]); //放回右边筷子

think;

}

}

该算法存在以下问题:当五个哲学家都想要进餐,分别拿起他们左边筷子的时候(都恰好执行完wait(chopstick[i]);)筷子已经被拿光了,等到他们再想拿右边的筷子的时候(执行 wait(chopstick[(i+l)%5]);)就全被阻塞了,这就出现了死锁。

为了防止死锁的发生,可以对哲学家进程施加一些限制条件,比如:

至多允许四个哲学家同时进餐;

仅当一个哲学家左右两边的筷子都可用时才允许他抓起筷子;

对哲学家顺序编号,要求奇数号哲学家先抓左边的筷子,然后再转他右边的筷子,而偶数号哲学家刚好相反。

3 解法

3.1 解法一

假设当一个哲学家左右两边的筷子都可用时,才允许他抓起筷子。

semaphore chopstick[5] = {1,1,1,1,1}; //初始化信号量

semaphore mutex=l; //设置取筷子的信号量

Pi(){ //i号哲学家的进程

while(1){

P(mutex); //在取筷子前获得互斥量,一次只能由一个哲学家取筷子

P(chopstick[i]) ; //取左边筷子

P(chopstick[(i+1)%5]); //取右边筷子

V(mutex); //释放取筷子的信号量

eat;

V(chopstick[i]); //放回左边筷子

V(chopstick[(i+1)%5]); //放回右边筷子

think;

}

}

3.2 解法二

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

semaphore chopstick[5] = {1,1,1,1,1}; //初始化信号量

semaphore eating = 4; //至多只允许四个哲学家可以同时进餐

Pi(){ //i号哲学家的进程

while(1){

think;

P(eating); //请求进餐,若是第五个则挨饿

P(chopstick[i]); //取左边筷子

P(chopstick[(i+1)%5]) ; //取右边筷子

eat;

V(chopstick[(i+1)%5]) ; //放回右边筷子

V(chopstick[i]) ; //放回左边筷子

V(eating); //释放信号量给其他挨饿的哲学家

}

}

3.3 解法三

仅当哲学家的左右两只筷子均可使用,才允许他拿起筷子进餐。

semaphore chopstick[5] = {1,1,1,1,1}; //初始化信号量

semaphore mutex = 1; //设置取筷子的信号量

Pi(){ //i号哲学家的进程

while(1){

think;

P(mutex); //在去筷子前获得互斥量

P(chopstick[i]); //取左边筷子

P(chopstick[(i+1)%5]) ; //取右边筷子

V(mutex); //释放互斥量

eat;

V(chopstick[(i+1)%5]) ; //放回右边筷子

V(chopstick[i]) ; //放回左边筷子

}

}

3.4 解法四

规定奇数号哲学家先拿他左边的筷子,然后在去拿右边的筷子;而偶数号哲学家则相反。按此规定,将是1、2号哲学家竞争1号筷子;3、4号哲学家竞争3号筷子。

即5位哲学家都先竞争奇数号筷子,获得后,再去竞争偶数号筷子,最后总会有一位哲学家能够获得两只筷子而进餐。

semaphore chopstick[5] = {1,1,1,1,1}; //初始化信号量

Pi(){ //i号哲学家的进程

while(1){

think;

if(i%2==0){

P(chopstick[(i+1)%5]) ; //取右边筷子

P(chopstick[i]); //取左边筷子

eat;

V(chopstick[(i+1)%5]) ; //放回右边筷子

V(chopstick[i]) ; //放回左边筷子

}else{ //奇数哲学家,先左后右

P(chopstick[i]); //取左边筷子

P(chopstick[(i+1)%5]) ; //取右边筷子

V(mutex); //释放互斥量

eat;

V(chopstick[i]) ; //放回左边筷子

V(chopstick[(i+1)%5]) ; //放回右边筷子

}

}

}

3.5 解法五

采用AND型信号量机制来解决,即要求每个哲学家先获得两个临界资源(筷子)后方能进餐。

semaphore chopstick[5] = {1,1,1,1,1}; //初始化信号量

semaphore mutex = 1; //设置取筷子的信号量

Pi(){

while(1){

think;

P(chopstick[i],chopstick[(i+1)%5]);

eat;

V(chopstick[i],chopstick[(i+1)%5]);

}

}

4 拓展

5个哲学家问题本质上是解决并发程序中的死锁和饥饿,可以将推广为更一般的n个进程,m个共享资源的问题。

哲学家就餐问题python_无聊的哲学家进餐问题相关推荐

  1. 哲学家就餐问题python_哲学家就餐问题与死锁

    问题描述 哲学家就餐问题(Dining philosophers problem)是在计算机科学中的一个经典问题,用来演示在并发计算中多线程同步(Synchronization)时产生的问题. 哲学家 ...

  2. 哲学家就餐问题c语言_哲学家就餐问题的一种Python解决方案

    哲学家就餐问题一直是多线程同步问题的经典案例,本文中展示了多线程竞争共享资源带来的死锁问题,并介绍了一种简单的解决方案. 哲学家就餐问题 哲学家最擅长的就是思考和吃饭 ,当他们感觉累的时候,就会拿起一 ...

  3. 哲学家就餐问题python_哲学家就餐-同步问题解析-python

    五个哲学家吃五盘通心粉,由于通心粉很滑,所以必须要拿起左右两边的叉子才能吃到. 叉子的摆放如图所示. 那么问题来了:能为每一个哲学家写一段描述其行为的程序,保证不会出现死锁. 解法1:让他等待能够使用 ...

  4. 哲学家就餐问题实验报告

    哲学家就餐问题 两个地方应该是pv操作,pv都是操作元语,不可中断 p操作是将信号量-1 v操作是将信号量+1 pv一定要配对使用 哲学家进餐可以通过信号量机制解决,避免死锁 注释如下: test(i ...

  5. 多线程之哲学家就餐问题(java代码含注释)

    什么是哲学家就餐问题 有五个哲学家在一张桌上,他们交替思考和吃饭.每个人只能拿自己左右手边的叉子,当他们拿到两只叉子的时候才能吃饭,吃完饭就放下叉子开始思考,每个哲学家不能同时拿起两只叉子.用程序实现 ...

  6. 哲学家进餐问题pv_【jMiniLang】哲学家就餐问题

    演示GIF(1.57MB),控制台输出效果(还有parser/vm/ui)自己实现: 信号量与PV原语 信号量为正数代表有空闲资源,为零与负数代表没有空闲资源.负数的绝对值代表等待的进程个数.信号量用 ...

  7. php 哲学家进餐,IPC问题-哲学家就餐(示例代码)

    如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃.哲学家在桌上只有思考(等待)和吃面(执行).看起来最多是只有2个人能同时吃. 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了 ...

  8. Linux哲学家进餐杀死进程,100分跪求“哲学家就餐问题”在 Linux下运行的源代码(后缀名为.c)!!!...

    如题. | 代码大致如下,当然不能直接使用,我没写P,V操作的函数. # define N 5 /* 哲学家数目 */ # define LEFT (i-1+N)%N /* i的左邻号码 */ # d ...

  9. 哲学家就餐问题python伪代码_GitHub - doooooit/Dining-philosophers-problem: 哲学家进餐问题的两种解决方法...

    哲学家就餐问题 问题描述 哲学家就餐问题(Dining philosophers problem)可以这样表述,假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考.吃东西的时候, ...

  10. 哲学家就餐问题--信号量和互斥量预防死锁

    哲学家就餐问题可以采取预防死锁的方案,就是使用互斥量和信号量锁定资源. 互斥量: 对资源进行锁定的意思就是说,当一个哲学家使用叉子的时候,他首先要先把叉子锁定,然后,拿起来.这个时候如果别的哲学家也来 ...

最新文章

  1. 同一个类 cannot be cast to_留学热门assignment之 税收筹划类essay
  2. 源码资本深耕“三横九纵”科技助力网聚优秀企业
  3. kali学习日记第二篇 -- Nessus
  4. JavaScript – 6.JS面向对象基础(*) + 7.Array对象 + 8.JS中的Dictionary + 9.数组、for及其他...
  5. 【Java基础】字符串与数组
  6. Unix时间戳转换(python)
  7. 一文详解神经网络与激活函数的基本原理
  8. Vue脚手架搭建项目
  9. 小程序 mpvue 生命周期一览
  10. 思杰彻底简化浏览器应用的安全交付
  11. SPSS 项目分析(图文+数据集)【SPSS 032期】
  12. 好书推荐_Windows程序设计(第五版)
  13. IP归属地解析之离线纯真数据库分享
  14. win10 shift+右键打开cmd
  15. 自动设置为兼容模式html,什么是兼容模式?
  16. 副本,字节跳动技术整理
  17. 2018 苹果开发者账号注册、付款流程图解
  18. python打印pdf特定页面_使用Python自由切分pdf文件提取任意页面
  19. 养生之道——》每天8杯水
  20. 苹果 微信发件 服务器,如何使用iPhone自带的邮件客户端管理企业邮箱?

热门文章

  1. 「堡垒之夜」母公司Epic元宇宙蓝图:颠覆Facebook的社交媒体,拆除苹果的高墙花园...
  2. xp系统一直跳出宽带连接服务器,xp系统一直显示正在获取网络地址的操作方案...
  3. o2o模式都有哪些应用场景?
  4. Android 文件选择/文件管理
  5. webUploader选择文件按钮无效
  6. 计算机类耗品有哪些,办公用品和办公耗材清单有哪些?
  7. theano入门学习
  8. 2.Smali的基础语法
  9. 计算机毕业设计 SSM+Vue音乐播放网站系统 云音乐播放系统 付费音乐播放系统Java Vue MySQL数据库 远程调试 代码讲解
  10. Thinkpad E475换装Win7后,网络连接无故中断无法再次连接的问题