当前位置: 首页 > 编程日记 > 正文

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

1794fd8c2e197739e707e367b4d6b9bb.png
哲学家就餐问题一直是多线程同步问题的经典案例,本文中展示了多线程竞争共享资源带来的死锁问题,并介绍了一种简单的解决方案。

哲学家就餐问题

哲学家最擅长的就是思考和吃饭 ,当他们感觉累的时候,就会拿起一双筷子去吃盘子里的寿司,吃完后放下筷子,又进入思考状态。使用互斥锁解决共享资源冲突的算法是,当哲学家想吃寿司时,会先拿起最近的筷子并上锁,然后拿起另一只筷子,当拥有两把筷子的时候,哲学家才能拿起一块寿司,多名哲学家进行相同的操作,他们继续在吃饭和思考之间交替,但由于是并发线程调度的不可预测性,如果哲学家同时拿起离自己最近的筷子,便会导致死锁的问题

4ba16631d82b6bc4e15ebfebe6807b65.png
哲学家就餐问题

具体场景如上图所示,有三位科学家Barron、Olivia和Steve,他们旁边各有两根筷子,总共为三根筷子A,B和C。在下面的示例程序中,phlosohper()函数代表只会思考和吃饭的哲学家,该函数有三个输入参数,哲学家的名字name以及两把锁,分别为first_chopsticksecond_chopstic,表明哲学家获得两把锁的顺序。

""" Three philosohpers, thinking and eating sushi """import threadingchopstick_a = threading.Lock()
chopstick_b = threading.Lock()
chopstick_c = threading.Lock()
sushi_count = 5def philosohper(name, first_chopstick, second_chopstick):global sushi_countwhile sushi_count > 0:  # eat sushi until it's all gonefirst_chopstick.acquire()second_chopstick.acquire()if sushi_count > 0:sushi_count -= 1print(name, 'took a piece! Sushi remaining:', sushi_count)second_chopstick.release()first_chopstick.release()if __name__ == '__main__':threading.Thread(target=philosohper, args=('Barron', chopstick_a, chopstick_b)).start()threading.Thread(target=philosohper, args=('Olivia', chopstick_b, chopstick_c)).start()threading.Thread(target=philosohper, args=('Steve', chopstick_c, chopstick_a)).start()

在主程序中我们创建了Baron,Olivia和Steve的三个哲学家线程,每位哲学家线程中配置了三只筷子中的两只供哲学家共享使用,Baron首先获得面前的A和B;Olivia获得面前的B和C;Steve首先获得C和A。在这种情况下,我们尝试运行一下程序,如下所示显示结果是正确的。

$ python deadlock.py
Barron took a piece! Sushi remaining: 4
Barron took a piece! Sushi remaining: 3
Barron took a piece! Sushi remaining: 2
Barron took a piece! Sushi remaining: 1
Barron took a piece! Sushi remaining: 0

即使存在死锁的可能性,死锁一般也难以检测和调试,如果你足够幸运,程序可能从来都不会遇到死锁问题。我们这里为了给这个程序提高产生死锁的几率,我们把寿司从5个增加到500个,现在是三个真正饥饿的哲学家了!再次运行程序,结果程序在490个寿司处发生死锁了。

$ python deadlock.py
Barron took a piece! Sushi remaining: 499
Barron took a piece! Sushi remaining: 498
Olivia took a piece! Sushi remaining: 497
Olivia took a piece! Sushi remaining: 496
Barron took a piece! Sushi remaining: 495
Barron took a piece! Sushi remaining: 494
Barron took a piece! Sushi remaining: 493
Barron took a piece! Sushi remaining: 492
Barron took a piece! Sushi remaining: 491
Barron took a piece! Sushi remaining: 490

如果我们再次运行程序,死锁会出现在不同数量的寿司之上,这依赖于操作系统调度线程的不同而不同。如果足够幸运的话,该程序可能会正常退出,但编程不能依靠运气,所以下面我们提供两种简单的死锁解决方法。

解决死锁的一种简单方案

如何避免死锁问题是通过互斥机制保护关键代码段的常见挑战,本文介绍一种简单的解决方案,将锁赋予优先级,并按照优先级确定锁定顺序。比如我们将设置筷子A的优先级最高,B是第二,C次之。每个哲学家都应该首先获得距离他们优先级最高的筷子。按照这一方法,需要对文中的代码进行修改,调整线程获取锁的顺序,A和C进行互换。

threading.Thread(target=philosohper, args=('Steve', chopstick_a, chopstick_c)).start()

哲学家Steve首先获得A然后获得C,再次运行程序,结果显示正确。防止死锁的最简单方法便是按照锁的优先级顺序进行获取。目的是为了确保每个线程始终以相同的顺序进行锁定。注意的程序只需要一个锁来保护互斥资源,文中为了增加死锁的可能性,在内部嵌套了两个锁来增加程序复杂度,随着程序的复杂性进一步增加,识别和避免潜在的死锁也将变得越来越困难。

相关文章:

倒计时1天,2018 AI开发者报名通道即将关闭(附参会提醒)

参加 2018 AI开发者大会,请点击 ↑↑↑随着 AI 逐渐转为各大科技巨头的战略主战场,人工智能技术亦是长立风口,向阳而生。越来越多的发展趋势表明,未来的人工智能将逐步迈入广泛普及阶段,继而深入影响人类日常的生产生活…

Linux安全检查方法

检查系统密码文件,查看文件修改日期 [rootfedora ~]# ls -l /etc/passwd 查看passwd文件中有哪些特权用户 [rootfedora ~]# awk -F: $30 {print $1} /etc/passwd 查看系统里有没有空口令帐户 awk -F: length($2)0 {print $1} /etc/shadow 检查系…

Ubuntu Server 12.04下cobbler + dnsmasq +tftpd-hpa的安装配置(四)

四、自定义 kickstart 文件 Kickstart最早是RedHat公司用来自动部署RedHat操作系统的,通过Kickstart配置文件,通常安装过程中需要交互输入的信息就都可以自动应答。 通过Kickstart安装操作系统一般是这样几个步骤: Create a kickstart file. …

AI 技术实力图谱全解析!2018 中国 AI 开发者大会重磅来袭

【2018 AI 开发者大会图文直播】 11 月 8 日,由中国专业 IT 社区 CSDN 与硅谷 AI 社区 AICamp 联合出品的 2018 中国 AI 开发者大会(AI NEXTCon) 在北京拉开帷幕,近百位中美顶尖 AI 专家、知名企业代表、逾千名 AI 开发者&#x…

sql的不等于条件优化_SQL优化案例(2):OR条件优化

随后上一篇文章《 SQL优化案例(1):隐式转换》的介绍,此处内容围绕OR的优化展开。在MySQL中,同样的查询条件,如果变换OR在SQL语句中的位置,那么查询的结果也会有差异,在多个复杂的情况下,可能会带…

所有 SAP 现在开设的标准课程

下面是 SAP 中国的教育培训首页,里面有 SAP 最新最完整的培训教育计划。 http://www30.sap.com/china/services/education/index.epx 从中可以看出,随着 SAP 的发展,BC4xx 系列课程已经发生了很大改变,取消了 BC404、BC406&#x…

动态展开所有_库存与市场需求之间如何“动态”共舞?库存计划动态模型构建分享...

库存(Stock)是用来提高交货速度、缓冲需求到单高峰的常用手段,通过按库存生产(MTS)的方法,用储备库存来满足客户需求、并按一定规则补货,无需等待生产周期,可极快地交付。相比按订单生产(MTO)的模式,采用安全库存可以有…

Linux下DNS简单部署(主从域名服务器)

一、DNS简介 DNS(Domain Name System),域名系统,因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终…

Neurala与CSDN宣布战略合作,将一站式AI平台BrainBuilder带给中国开发者

11 月 8 日,美国人工智能创新企业 Neurala 与中国开发者社区 CSDN 联合宣布,正式成为战略合作伙伴,通过双方的合作,将 BrainBuilder 平台提供给中国的更多开发者和教育培训机构。Brain Builder 是 Neurala 开发的一站式 AI 平台。…

使用idea创建springboot项目并打成war包发布到weblogic上...

部署tomcat也是类似的,但是需要注意项目配置的路径,或者直接将项目放到webapp的ROOT目录下。 使用工具:intelliJ IDEA2016.3, jdk1.8 ,weblogic12 一 使用idea创建springboot项目 File-》New -》Project 选择jdk版本…

cs架构嵌入bs_CS与BS架构区别、比较、及现状与趋势分析

一、简介 CS即Client/Server(客户机/服务器)结构,C/S结构在技术上很成熟,它的主要特点是交互性强、具有安全的存取模式、网络通信量低、响应速度快、利于处理大量数据。但是该结构的程序是针对性开发,变更不够灵活,维护和管理的难…

大数据的“平民化”、“流动化”、“商业化”推动企业升级与转型

CSDN 出品的《2018-2019 中国人工智能产业路线图》V2.0 版已经重磅面世! V1.0 版发布以来,我们有幸得到了诸多读者朋友及行业专家的鼎力支持,在此表示由衷感谢。此次 V2.0 版路线图进行了新一轮大升级,内容包括 3 大 AI 前沿产业趋…

APIPA是什么?

<?xml:namespace prefix o ns "urn:schemas-microsoft-com:office:office" />APIPA&#xff08;Automatic Private IP Addressing&#xff0c;自动专用IP寻址自动专用IP寻址&#xff09;&#xff0c;是一个DHCP故障转移机制。当DHCP服务器出故障时&#xff…

birt报表表格边框_手把手教你五步制作出一张领导驾驶舱报表

领导驾驶舱报表是一款为企业内部领导及相关高管提供企业数据指标分析的报表&#xff0c;用来实时反映企业的运行状况&#xff0c;将企业管理决策提升到一个新的高度。今天小编用亿信华辰的亿信ABI给大家实际演示&#xff0c;通过5个步骤就可以刷刷刷“变”出漂亮的领导驾驶舱&a…

Web的现状:网页性能提升指南

互联网发展非常迅速&#xff0c;所以我们创造了Web平台。通常 我们会忽视连通性等问题&#xff0c;但用户们却不会视而不见 。一瞥万维网的现状&#xff0c;可以发现我们并没有用同情心、变通意识去构建它&#xff0c;更不要说性能了。 所以&#xff0c;今天的Web是什么状态呢?…

[导入]ExtJs 2.0 弹窗事例

网站: JavaEye 作者: ppkosd 链接&#xff1a;http://ppkosd.javaeye.com/blog/133004 发表时间: 2007年10月18日 责任不是你应该做的事情,而是你必须做的事情 -- ppkosd 这个EXT 2.0 的例子 讲的是怎么样用aspserver和ext2.0构建弹窗效果! 服务器部分&#xff1a; 代码va…

双十一报名截止,决赛在即!AI Challenger2018极客峰会免费抢票!

第二届“AI Challenger 全球AI挑战赛”各赛道竞赛经过两个多月的激烈角逐&#xff0c;报名将于北京时间2018年11月11日23:59:59正式截止&#xff0c;随即进入决赛阶段&#xff0c;最终每个竞赛的TOP 5团队将进入12月18、19日在北京举办的总决赛答辩及颁奖礼&#xff0c;角逐超过…

取值范围_从int取值范围谈起

int取值范围我们在面试过程中&#xff0c;或者在准备面试过程中&#xff0c;可能会遇到这样一个问题&#xff1a;Java中int的取值范围是什么&#xff1f;这个问题比较常见&#xff0c;也很简单&#xff0c;相信大部分Java开发人员都可以快速答上来&#xff1a;[ , ]即使不能马上…

MonoRail学习笔记五:定制服务实现自定义功能

在上一篇MonoRail学习笔记四&#xff1a;MonoRail基本流程分析中我提到&#xff0c;MonoRail中可以自定义一些服务。比如可以定义自己的Url解析类&#xff0c;来实现http://localhost:***/index.rails等http://localhost:***/*.rails的效果。具体步骤如下&#xff1a;1、修改we…

我的第一个vb实例--红楼梦测试小程序

http://files.cnblogs.com/gengxiaochao/hlmtest.rar 转载于:https://www.cnblogs.com/gengxiaochao/archive/2007/11/26/973072.html

2018 AI产业投融资分析:热钱涌向何处,谁的“寒冬”将至?

AI科技大本营按&#xff1a;本篇内容来自由 CSDN 出品的《2018 中国人工智能产业路线图》V2.0 版中 1.4 章投融资分析篇&#xff0c;通过对各大 AI 行业进行相关数据分析&#xff0c;我们尽可能勾勒出中国 AI 产业发展现状&#xff0c;并对行业未来做出趋势判断。产业路线图 2.…

mvc的宿舍管理系统源码 基于jsp_[源码和文档分享]基于JSP的MVC框架实现的图书推荐系统展示平台网站...

推荐系统是目前互联网中最常见的一种智能产品形式。由于网络中信息量的快速增长以及图书出版行业出版量的攀升&#xff0c;人们需要一种办法&#xff0c;来解决信息过载的问题。此外&#xff0c;用户访问网络是为了获取信息&#xff0c;但并不是所有的访问都有很强的目的性&…

Ms Sql Server 基本管理脚本(1)

/* *登录帐户管理*/--授予Windows账号test访问数据库的权限exec sp_grantlogin teacher-jin\test--拒绝Windows账号test访问数据库的权限exec sp_denylogin teacher-jin\test--回收Windows账号test访问数据库的权限exec sp_revokelogin teacher-jin\test--授予Windows组users访…

配置Android开发环境(fedora)

配置Android开发环境&#xff08;fedora) 最进看见google的Android&#xff0c;体会了下&#xff0c;按照官网上的配置了下&#xff0c;后编了个Hello Android结果发现没能传到模拟器上&#xff1b;于是在windows xp上试了下&#xff0c;没问题。那么为什么会有问题呢&#xff…

精选Python开源项目Top10!

作者 | MyBridge译者 | Linstancy整理 | Jane出品 | AI科技大本营【导读】过去一个月里&#xff0c;我们对近 250 个 Python 开源项目进行了排名&#xff0c;并挑选出热度前 10 的项目。这份清单的平均 github star 数量高达 1140&#xff0c;涵盖了包括性能分析、提取 PDF 中的…

全局声明宏定义_Rust语言:元编程,强大的宏系统,菜鸟到高手进阶的必经之路...

编程语言的宏操作&#xff0c;在C和C早期就已经存在。宏可以将重复的代码用更简短的宏函数替换&#xff0c;编译过程中再展开&#xff0c;使得代码编写的更简洁。Rust提供了两种宏&#xff0c;分别是声明宏和过程宏。声明宏的形式和C的宏替换类似&#xff0c;区别在于Rust会对宏…

SpringBoot 1024行代码 - 系统监控工具 Actuator简介

前言 在生产环境中&#xff0c;我们比较关心任意时刻一个JVM的运行情况。SpringBoot为我们提供了一个方便的功能模块Actuator。只要简单几步就可以为我们的应用添加查询系统各项指标的功能。 准备工作 完成SpringBoot 1024行代码 - Getting Started&#xff08;一个简单的web应…

新一代宽带路由器—Vigor防火墙路由器

华盖科技隆重推出新一代宽带路由器—Vigor防火墙路由器上网行为管理时代的来临一、网络信息乱七八糟 计算机病毒泛滥、******造成信息丢失&#xff1b;不健康的文字、图片、广告&#xff0c;带有淫秽、、暴力等有害信息的网站、不健康的网络信息影响了网络环境。如何保证信息的…

2018 中国AI人才大调查:14张图表解读他们来自何处,又将去往何方?

AI科技大本营按&#xff1a;本篇内容来自由 CSDN 出品的《2018 人工智能产业路线图》V2.0 版中 1.6 章人才分析篇&#xff0c;通过对相关 AI 人才各维度的数据分析&#xff0c;我们尽可能勾勒中国 AI 人才发展的全景面貌。产业路线图 2.0 完整版我们将很快提供读者下载&#xf…

用这个Python库,训练你的模型成为下一个街头霸王!

作者 | MJ-Murray 译者 | 孤鸿 整理 | Jane 出品 | AI科技大本营 从世界瞩目的围棋游戏 AlphaGo&#xff0c;近年来&#xff0c;强化学习在游戏领域里不断取得十分引人注目的成绩。自此之后&#xff0c;棋牌游戏、射击游戏、电子竞技游戏&#xff0c;如 Atari、超级马里奥、…