哲学家就餐-同步问题解析-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.对象的绑定方法 首先我们明确一个知识点,凡是类中的方法或函数,默认情况下都是绑定给对象使用的.下面,我们通过实例,来慢慢解析绑定方法的应用. ...
随机推荐
- MD5的32位加密方法
/// <summary> /// MD532位加密方式 /// </summary> /// <param name="str">用户原始密码 ...
- framework7 可以拉动右侧工具栏和点击当前item就可以出发事件的HTML结构
<li class="swipeout"> <div class="swipeout-content item-content"> &l ...
- python 爬poj.org的题目
主要是正则表达式不熟练,基础知识不扎实,函数也不怎么会用,下次再深入了解这3个函数吧. 主要是一个翻页的功能,其实,就是通过一个url替换一下数字,然后得到一个新的url,再找这个新的链接的信息. # ...
- python 3+djanjo 2.0.7简单学习(三)--Django 管理页面
django里自带了一个管理页面,也就是后台,下面来学习一下 1.创建超级管理员 python manage.py createsuperuser 键入你想要使用的用户名,然后按下回车键: Usern ...
- (python)剑指Offer:数组中重复的数字
问题描述 在长度为n的数组中,所有的元素都是0到n-1的范围内. 数组中的某些数字是重复的,但不知道有几个重复的数字,也不知道重复了几次,请找出任意重复的数字. 例如,输入长度为7的数组{2,3,1, ...
- svn: 处于冲突状态
svn: 提交失败(细节如下):svn: 提交终止: “/home/usa/svn/aispeech/air201102/branches/opt-vite/wvite” 处于冲突状态 删除文件夹wv ...
- System.Web.UI
类: System.Web.UI.Page 所以窗体继承的类
- linux命令详解-useradd,groupadd
linux命令详解-useradd,groupadd 我们在linux命令行中输入useradd: Options: -b, --base-dir BASE_DIR base direc ...
- 字符串替换For linux C
1.临时空间给了个1024,不需要可减少长度. 2.结果只用用strcpy了,没校验. bool Replace(char *str,const char *src, const char *des) ...
- cordova创建工程添加插件
创建工程 phonegap创建工程 代码 用以创建自己需要的 工程名 ; 报名 ;类名 ; 应用名 cordova create hello com.example.hello HelloWo ...