最近操作系统刚学完这部分内容,老师要求下去自己实践一下,在网上看了看发现用python解决该问题的博文很少,而且好多都是错的,于是就自己写了一段代码

# and型信号量解决哲学家就餐问题
import time
import threadingclass Philosophy(threading.Thread):def __init__(self, key, lefthand, righthand, hungry):threading.Thread.__init__(self)self.key = key  # 哲学家编号self.lefthand = lefthand  # True表示哲学家左手拿起筷子,False表示哲学家左手没有拿起筷子self.righthand = righthandself.hungry = hungry  # True表示哲学家饿了def pick(self):threadLock.acquire()if chopsticks[self.key] and chopsticks[(self.key + 1) % 5] and not self.lefthand and not self.righthand and self.hungry:  # 可以拿筷子time.sleep(5)chopsticks[(self.key + 1) % 5] = Falseself.lefthand = Trueprint('哲学家%s拿起了左边的筷子!' % self.key)time.sleep(5)chopsticks[self.key] = False  # 哲学家的筷子被拿self.righthand = True  # 哲学家右手拿起筷子print('哲学家%s拿起了右边的筷子!' % self.key)threadLock.release()def eat(self):if self.lefthand and self.righthand and self.hungry:  # 可以开始吃饭time.sleep(5)print('哲学家%s开始吃饭' % self.key)time.sleep(5)print('哲学家%s吃完饭了' % self.key)self.hungry = Falsetime.sleep(5)print('哲学家%s放下筷子开始思考' % self.key)self.lefthand = False  # 哲学家左手放下筷子self.righthand = False  # 哲学家右手放下筷子chopsticks[self.key] = True  # 哲学家的筷子可以用chopsticks[(self.key + 1) % 5] = True  # 哲学家右边的筷子可以用def run(self):while True:self.pick()self.eat()threadLock = threading.Lock()
chopsticks = [True, True, True, True, True]
philosophy0 = Philosophy(0, False, False, True)
philosophy1 = Philosophy(1, False, False, True)
philosophy2 = Philosophy(2, False, False, True)
philosophy3 = Philosophy(3, False, False, True)
philosophy4 = Philosophy(4, False, False, True)philosophy0.start()
philosophy1.start()
philosophy2.start()
philosophy3.start()
philosophy4.start()

结果如下:
哲学家0拿起了左边的筷子!
哲学家0拿起了右边的筷子!
哲学家0开始吃饭
哲学家2拿起了左边的筷子!
哲学家2拿起了右边的筷子!
哲学家0吃完饭了
哲学家2开始吃饭
哲学家0放下筷子开始思考
哲学家4拿起了左边的筷子!
哲学家2吃完饭了
哲学家2放下筷子开始思考
哲学家4拿起了右边的筷子!
哲学家4开始吃饭
哲学家1拿起了左边的筷子!
哲学家4吃完饭了
哲学家1拿起了右边的筷子!
哲学家4放下筷子开始思考
哲学家1开始吃饭
哲学家3拿起了左边的筷子!
哲学家1吃完饭了
哲学家3拿起了右边的筷子!
哲学家1放下筷子开始思考
哲学家3开始吃饭
哲学家3吃完饭了
哲学家3放下筷子开始思考

python解决哲学家就餐问题(and型信号量)相关推荐

  1. 用信号量实现进程互斥示例和解决哲学家就餐问题

    用信号量实现进程互斥示例和解决哲学家就餐问题 参考文章: (1)用信号量实现进程互斥示例和解决哲学家就餐问题 (2)https://www.cnblogs.com/alantu2018/p/84731 ...

  2. 哲学家就餐问题php代码,Python实现哲学家就餐问题实例代码

    哲学家就餐问题: 哲学家就餐问题是典型的同步问题,该问题描述的是五个哲学家共用一张圆桌,分别坐在五张椅子上,在圆桌上有五个盘子和五个叉子(如下图),他们的生活方式是交替的进行思考和进餐,思考时不能用餐 ...

  3. 【操作系统⑧】——信号量与PV操作(下)【哲学家进餐问题 AND型信号量 信号量集机制】

  4. 哲学家就餐问题python_Python实现哲学家就餐问题实例代码

    哲学家就餐问题: 哲学家就餐问题是典型的同步问题,该问题描述的是五个哲学家共用一张圆桌,分别坐在五张椅子上,在圆桌上有五个盘子和五个叉子(如下图),他们的生活方式是交替的进行思考和进餐,思考时不能用餐 ...

  5. 哲学家就餐问题(条件变量)

    1965年,著名计算机科学家艾兹格·迪科斯彻,提出并解决了一个他称之为哲学家就餐的同步问题. 从那时起,每个发明同步原语的人,都希望通过解决哲学家就餐问题来展示其同步原语的精妙之处. 这个问题可以简单 ...

  6. Java基础学习之并发篇:哲学家就餐问题

    学习目标 哲学家就餐问题是在计算机科学中的一个经典问题,用来演示在并行计算中多线程同步时产生的问题.在1971年,著名的计算机科学家艾兹格·迪科斯彻提出了一个同步问题,即假设有五台计算机都试图访问五份 ...

  7. 利用记录型信号量解决不会出现死锁的哲学家就餐问题

    试利用记录性信号量写出一个不会出现死锁的哲学家进餐问题的算法 规定在拿到左侧的筷子后,先检查右面的筷子是否可用.如果不可用,则先放下左侧筷子, 等一段时间再重复整个过程. 分析:当出现以下情形,在某一 ...

  8. 哲学家就餐问题python解决_关于哲学家就餐问题的分析代码.

    ①总体思路: 都去拿左边的筷子,并且最后一个人不能去拿筷子(防止大家都拿了左边的筷子,没有右边的筷子,导致死锁了),解决死锁问题的办法就是同时只允许四位哲学家同时拿起同一边的筷子,这样就能保证一定会有 ...

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

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

最新文章

  1. 使用TensorRT和Jetson TX1 / TX2部署深度学习推理网络和深度视觉原语的指南 学习五
  2. JavaScript 中运算符的优先级
  3. 为什么Intel Realsense D435深度摄像头在基于深度的水平方向障碍物检测(避障)方案中,摄像头不宜安装太高?
  4. 【转】ABP源码分析三十七:ABP.Web.Api Script Proxy API
  5. hadoop hbase java_Hadoop、Hbase伪分布式安装
  6. chart放入panel_使用JPanel将ChartPanel添加到JTabbedPane
  7. 杨辉三角形(简明易懂)
  8. 快速排序QuickSort
  9. MyEclipse 10.5与ExtJS 4.1.1自动代码提示
  10. lammps教程:1D正弦粗糙界面建模建模教程
  11. Android签名校验
  12. 输出100以内的奇数
  13. 视频基础 以及 MP4 容器解封装
  14. 计算机bios无法进入安全模式,电脑的BIOS设置能进入安全模式吗
  15. numpy数组拼接方法介绍
  16. pathon和python_【pathon基础】初识python
  17. serial port not selected
  18. pytorch中dataloader的num_workers参数
  19. RISC-V Linux 启动流程分析
  20. 分享某程序员裸辞全职在家的接单感受

热门文章

  1. matlab中拉式域转时间域,Bark域介绍和线性频率域转换到Bark域
  2. 基于盲盒商城的飞机大战游戏
  3. mysql 执行错误1395_主义 - 常规错误:1395无法删除连接视图
  4. 基于Go语言GoFrame+Vue+ElementUI实现的权限控制系统
  5. unity Input
  6. 2022电大国家开放大学网上形考任务-公司财务非免费(非答案)
  7. mongodb pymongo
  8. 【Python 教程】11_基础数据类型
  9. 设计婴儿、人体冷冻... 颠覆未来的8种技术!网友:太可怕了
  10. R语言ggplot2可视化:使用patchwork包的align_patches函数将多个可视化图像对齐(align all plots)