哲学家就餐-同步问题解析-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的更多相关文章
- JAVA多线程学习--哲学家就餐问题
哲学家就餐问题是1965年由Dijkstra提出的一种线程同步的问题. 问题描述:一圆桌前坐着5位哲学家,两个人中间有一只筷子,桌子中央有面条.哲学家思考问题,当饿了的时候拿起左右两只筷子吃饭,必须拿 ...
- linux下多线程互斥量实现生产者--消费者问题和哲学家就餐问题
生产者消费者问题,又有界缓冲区问题.两个进程共享一个一个公共的固定大小的缓冲区.其中一个是生产者,将信息放入缓冲区,另一个是消费者,从缓冲区中取信息. 问题的关键在于缓冲区已满,而此时生产者还想往其中 ...
- JAVA并发,经典死锁案例-哲学家就餐
转自:http://blog.csdn.net/tayanxunhua/article/details/38691005 死锁经典案例:哲学家就餐. 这个案例会导致死锁. 通过修改<Java编程 ...
- 实例解析Python设计模式编程之桥接模式的运用
实例解析Python设计模式编程之桥接模式的运用 这篇文章主要介绍了Python设计模式编程之桥接模式的运用,桥接模式主张把抽象部分与它的实现部分分离,需要的朋友可以参考下 我们先来看一个例子: #e ...
- 解析Python编程中的包结构
解析Python编程中的包结构 假设你想设计一个模块集(也就是一个"包")来统一处理声音文件和声音数据.通常由它们的扩展有不同的声音格式,例如:WAV,AIFF,AU),所以你可能 ...
- 哲学家就餐问题-Java语言实现死锁避免
哲学家就餐问题-Java语言实现死锁避免 我死锁预防是至少破坏死锁产生的四个必要条件之一,带来的问题就是系统资源利用率低且不符合开发习惯,而死锁避免不是事先釆取某种限制措施破坏死锁的必要条件,只是注意 ...
- python学习(解析python官网会议安排)
在学习python的过程中,做练习,解析https://www.python.org/events/python-events/ HTML文件,输出Python官网发布的会议时间.名称和地点. 对ht ...
- xml 解析 python
1 综述 有很多种解析方法. (1) DOM 缺点是:1 不能解析格式不正确或者不规则xml 2据说只能解析utf-8格式,非utf-8需要转码 与SAX比较,DOM典型的缺点是比较慢,消耗更 ...
- 全面解析python类的绑定方法与非绑定方法
类中的方法有两类: 绑定方法 非绑定方法 一.绑定方法 1.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...
随机推荐
- 单调队列 poj2823,fzu1894
题目链接:http://poj.org/problem?id=2823 用RMQ超时了,我想应该是不会的,看discuss说,之前RMQ过了. 维护两个单调队列. 单调递减的队列,每插入一个时: 超过 ...
- idea中使用maven方式使用jetty+cmd中使用Jetty运行(maven)Web项目
进度条件:必须是web项目 一.使用idea 导入项目或者打开(如果有可以忽略) 导入项目 . 全部next 导入成功,进行打开pom文件加入插件 <plugins> <!-- je ...
- C# grid控件用数据库分页后台怎么写?
C#grid控件使用数据库分页的写法如下: mySystem.GetDataa(gridName.PageIndex *gridName.PageSize + 1, (gridName.PageInd ...
- ReplaceChar
好吧,给个char的,替换单个字符.这样会快一些吧,这个是置换,连长度都不用了 bool ReplaceChar(char *str,const char src, const char dst){ ...
- 浅谈PHP中的数组和JS中的数组
最近在做前后端对接的时候,遇到一个问题,前端要求返回的数据格式是左边的,但是我通过json_encode返回到的数据格式是右边的 注意:数据格式从"[]"(数组)变成了&quo ...
- ubuntu16 升级pip3后报错File "/usr/bin/pip3", line 9, in <module> from pip import main ImportError: cannot import name 'main'
问题:ubuntu16 执行pip3 install --upgrade pip之后,pip3执行出错. Traceback (most recent call last): File "/ ...
- selenium破解极限
一共分为两端段代码: 第一段:获取cookie 第二段:通过cookie登陆 这里以百度云为例: 第一部分:保存cookies,直接在cmd中执行就好 >>> from seleni ...
- laravel环境配置的常见问题
从开始下载相关软件到现在,整整一天,终于成功了.不得不说官方的说明文档相当详细,毕竟我都成功了,不是吗,哈哈. 好了,不多说了,直接上干货 官方环境配置文档地址:https://laravel-chi ...
- 深入理解PHP数组函数和预定义接口
一. PHP对数组的过滤 函数: array_filter(p1[,p2]) 参数p1是要过滤的数组,参数p2是自定义过滤会掉函数(可以是匿名函数) 例子: <?php $arr = ['',n ...
- <Docker学习>3. docker镜像命令使用
镜像提供容器运行时所需要的程序,资源.配置文件等,是一个特殊的文件系统.是容器运行的基础.镜像是多层文件系统组成的,是一个分层存储的架构,在镜像的构建中,会一层层的构建,每一层构建完成就不会发生改变, ...