哲学家就餐问题python_哲学家就餐-同步问题解析-python
五个哲学家吃五盘通心粉,由于通心粉很滑,所以必须要拿起左右两边的叉子才能吃到。
叉子的摆放如图所示。
那么问题来了:能为每一个哲学家写一段描述其行为的程序,保证不会出现死锁。
解法1:让他等待能够使用的时候,然后去叉子用餐
这种方法很显然行不通,如果所有人都去拿左边的叉子,就没有人能够拿到右边的叉子
解法2:在拿到左叉的时候,然后检查右边的叉子是否可用,如果可用就拿起右叉,如果不行就放下左叉。
这种方法也是不行的,可能在某一个瞬间,可能在某一时刻哲学家一起拿起左叉然后看到右叉不可用,就都放下左叉,周而复始,进入"饥饿状态"。
解法3:我们忽略左右叉子的问题,讲每个哲学家的状态记录下来,然后只有当自己左右都为饥饿状态的时候 才能拿到叉子吃饭,否则进入阻塞状态。
那么一开始总有两个人能拿到叉子吃饭,吃了一些,放下叉子,然后问问左右的哲学家是否想吃。
#!/usr/bin/env python
#coding:utf-8
import threading
import time
mutex = threading.RLock()
state = [0,0,0,0,0]
rlock0 = threading.RLock()
rlock1 = threading.RLock()
rlock2 = threading.RLock()
rlock3 = threading.RLock()
rlock4 = threading.RLock()
class Phd():
def __init__ (self,key,left,right,lock):
self.key = key
self.left = left
self.right = right
self.lock = lock
z1 = Phd(0,1,4,rlock0)
z2 = Phd(1,0,2,rlock1)
z3 = Phd(2,1,3,rlock2)
z4 = Phd(3,2,4,rlock3)
z5 = Phd(4,3,0,rlock4)
obj_Phd_list = [z1,z2,z3,z4,z5]
inter = 0
def take_forks(zname):
global inter
while 1:
inter += 1
key = zname.key
mutex.acquire()
state[key] = 1
res = test(zname)
mutex.release()
if res == 1:
print ("----",zname.key,"hava eating----")
print ("----" ,zname.key,"put forks")
put_forks(zname)
else:
print("----",zname.key,"no forks")
zname.lock.acquire()
if (inter >= 30):
break
def test(i):
print(i.key,"--in the test")
if (state[i.key] == 1 & state[i.left] !=2 & state[i.right] != 2):
state[i.key] = 2
try:
i.lock.release()
except:
pass
return 1
return 0
def put_forks(i):
mutex.acquire()
state[i.key] = 0
test(obj_Phd_list[i.right])
test(obj_Phd_list[i.left])
mutex.release()
for i in range(5):
s = threading.Thread(target=take_forks,args=(obj_Phd_list[i],))
s.start()
哲学家就餐问题python_哲学家就餐-同步问题解析-python相关推荐
- 哲学家就餐问题python_哲学家就餐问题与死锁
问题描述 哲学家就餐问题(Dining philosophers problem)是在计算机科学中的一个经典问题,用来演示在并发计算中多线程同步(Synchronization)时产生的问题. 哲学家 ...
- 蜡笔同步 java_蜡笔同步常见问题解析
蜡笔同步常见问题解析,蜡笔同步是国内第一个实现联系人.短信.日历与通话记录实时同步的手机软件.下面是蜡笔同步常见问题解析,是不是遇到同样的烦恼,看看怎么解决吧! 手机蜡笔安装后如何启动? 安装手机蜡笔 ...
- 【游戏原理解析】帧同步核心技术解析
文章目录 帧同步核心技术解析 第一部分介绍帧同步与状态同步的区别 网络同步 状态同步 帧同步 其他同步 第二部分帧同步难点 网络方面传输难点 1.需要高频率同步的通讯 本地同步计算难点 2.不同平台的 ...
- php 哲学家进餐,IPC问题-哲学家就餐(示例代码)
如上图,有五位哲学家,盘中的食物只有左右两个叉子都拿起才能吃.哲学家在桌上只有思考(等待)和吃面(执行).看起来最多是只有2个人能同时吃. 版本一:这个思路的最糟糕的就是都拿起左边叉子,那样都没法吃了 ...
- 哲学家就餐 java_java模拟哲学家就餐问题
废话不多说 直接上代码 1.筷子类 他有两个属性, 一个是标示这根筷子在哪个哲学家手边,另一个属性标示这个筷子的状态,并且这个状态是随时从内存当中取出的 package com.bjs.dinning ...
- java中哲学家就餐死锁_哲学家就餐问题与死锁总结
死锁的四个条件: (1) 互斥条件:一个资源每次只能被一个进程使用. (2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放. (3) 不剥夺条件:进程已获得的资源,在末使用完之前 ...
- 像科学家一样思考python_像计算机科学家一样思考Python(第2版)
领取成功 您已领取成功! 您可以进入Android/iOS/Kindle平台的多看阅读客户端,刷新个人中心的已购列表,即可下载图书,享受精品阅读时光啦! - | 回复不要太快哦~ 回复内容不能为空哦 ...
- mysql增量同步kafka_canal解析mysql的binlog实时推送到kafka
今天整理一下以前写的一个kafka消费canal的demo,实现实时推送数据到kafka.首先先介绍一下canal,官网是这么说的: 主要用途是基于 MySQL 数据库增量日志解析,提供增量数据订阅和 ...
- python多线程实现同步的方式_深入解析Python中的线程同步方法
同步访问共享资源 在使用线程的时候,一个很重要的问题是要避免多个线程对同一变量或其它资源的访问冲突.一旦你稍不留神,重叠访问.在多个线程中修改(共享资源)等这些操作会导致各种各样的问题:更严重的是,这 ...
最新文章
- STM32 基础系列教程 2 - GPIO 按键输入
- php 变量 换行,php去除换行符的方法小结(PHP_EOL变量的使用)_PHP教程
- thinkphp仿百度文库网站源码
- nodejs 读取excel文件,并去重
- 【git】LibreSSL SSL_connect: SSL_ERROR_SYSCALL in connection to github.com:443
- 常用的排序算法总结(一)
- leetcode 354. 俄罗斯套娃信封问题(二维排序有关)
- CAD中 OLE不能旋转_【设计图文】大空间旋转喷头零件的数控加工工艺设计、编程与加工(有全套cad图+程序+中英文翻译)...
- linux卸载intel驱动程序,删除Ubuntu Intel官方驱动包并添加pdadoka PPA
- 基于SSM+Layui的逆风医疗管理系统
- iOS-AppStore 审核加速
- C编译错误,运行错误以及常见问题。
- 真空灾难:物理学最著名的未解难题之一
- PS Suite Studio Android 调试方法
- 量化投资 无套利 No-arbitrage
- dhu复试基础——36 水果价格
- 科学计量学类毕业论文文献有哪些?
- Go语言开发环境安装
- 我的世界红石科技计算机系统,我的世界真实还原科技产品,自动走时钟表,红石打造核心系统...
- (JLK105D)中山爆款LED恒流电源芯片方案
热门文章
- java49_java培训 java49条基础知识
- 白盒测试中的六种覆盖方法及案例分析
- matlab2018b中svm无法运行,关于matlab2018a版本错误使用 svmclassify 分类器
- android 评论的展开功能,Android开发实现ListView点击展开收起效果示例
- android 自定义view滚动条,Android自定义View实现等级滑动条的实例
- elementui分页组件按钮样式修改_Vue使用Elementui修改默认最快方法!
- ajax参数是json数据类型,如何保护$ .ajax数据类型:json Post参数
- 在scrapy中parse函数里面xpath的内容打印不出来_如何正确的使用Scrapy ?
- php 删除文件夹及文件夹,php删除一个路径下的所有文件夹和文件的方法
- 长安渝北工厂机器人_长安工厂探秘!解密CS75 PLUS究竟是怎样造出来的