首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

线程例题,哲学家用餐

例题,哲学家用餐: 在一张餐桌上坐着五个哲学家,但是却只有五根筷子,每个哲学家只有一根筷子,所以当一个哲学家要夹菜的时候需要用他旁边那个哲学家的筷子,被拿走筷子的哲学家则只能等待那个哲学家吃完放下筷子他才能夹菜...设计思路: 首先编写一个筷子类,每根筷子都是一个对象,这个类里有拿起、放下两个方法;当一个哲学家线程来调用拿起方法时,下一个哲学家线程就要进入等待状态,然后这个哲学家线程调用放下方法后,就激活那个等待中的哲学家线程...接着设计哲学家类,这个类继承Thread类,每个哲学家都是一个线程对象。...这类有三个属性,用于存放构造器的参数,这个类的构造器要求传递三个参数,分别是哲学家的名字(name)、右边的筷子(right)、左边的筷子(left)。...然后构建五个哲学家对象,分别传递相应的参数。接着将哲学家对象使用start方法启动。 代码示例: ? 运行结果: ?

56540
您找到你想要的搜索结果了吗?
是的
没有找到

6.哲学家就餐问题 原

哲学家就餐问题 有五个哲学家,他们的生活方式是交替的进行思考和进餐。哲学家们公用一张圆桌,分别坐在周围的五张椅子上。在圆桌上有5个碗和5支筷子。...平时一个哲学家进行思考,饥饿时便试图取用其左、右最靠近他的筷子,只有在他拿到两支筷子时才能进餐。进餐毕,放下筷子又继续思考。...分析 筷子是临界资源,在一段时间内只允许一个哲学家使用 用一个信号量表示一支筷子,由这5个信号量构成信号量组。...var chopstick:array[0……4] of semaphor 所有信号量被初始化为1 用记录型信号量解决哲学家进餐问题 第i个哲学家的活动可买描述为 repeat wait(chopstick...仅当哲学家的左右两支筷子均可使用时,才允许他拿起筷子进餐。 规定奇数号哲学家先拿起其左边的筷子,再拿左边的,偶数号哲学家则相反。

1.1K10

多线程互斥锁解决哲学家就餐问题

哲学家就餐问题是一个了解和练习线程间同步的非常好的小例子,题为 5 个哲学家(线程)围成一桌就餐,但是只有 5 只筷子(锁),一个人想要吃饭就必须要拥有左侧的筷子(锁1)和右侧的筷子(锁2)才能吃饭。...每一个哲学家刚进桌前都持有了自己左侧的筷子,这样所有人只有一只筷子都无法就餐,所以就要想办法去拿右侧的筷子,而因为右侧的筷子被别人持有,所以无法拿到,这个时间就成了死锁状态。...所以必须要有一个解锁的条件,那就是在哲学家尝试去拿右侧筷子的时候,如果失败了,那么将自己左手边的筷子放下,此时这个哲学家左侧人就可以持有他原来左手边的筷子来就餐了。...[5]; // 创建5个线程,并把结构体内容初始化后传递进去 for (i = 0; i < THREAD_COUNT; i++) { arg[i].pthread_idx = i;//线程ID,对应哲学家编号...arg[i].left = mutex[i];//锁1,对应哲学家左侧筷子 arg[i].right = mutex[(i + 1) % THREAD_COUNT];//锁2,对应哲学家右侧筷子 pthread_create

18110

哲学家进餐问题的模拟【操作系统】

则可能出现五个哲学家都饥饿时都拿着一直筷子。这样就可能五个哲学家都用不上餐。...才允许哲学家拿起筷子就餐 (3)规定奇数号哲学家先拿起右边筷子,然后再去拿左边筷子,而偶数号哲学家则相反。...而这时由思考到饥饿的哲学家1和哲学家4只好进入等待状态。...0和哲学家3吃完饭其左右筷子进入思考,此时哲学家2饥饿竞争到了起左右筷子进入吃饭状态,饿了的哲学家1只好又等待,此时哲学家4左右筷子可用则进入吃饭状态,没等到筷子的哲学家1只好回去继续思考。...实习中还有对LINUX操作系统内核代码的分析,使我们具体的认识了LINUX,了解其设计思想和功能模块,而在LINUX下的各种常用命令也要求我们熟练掌握。

40330

漫谈并发和并行:死磕哲学家进餐问题

哲学家进餐问题 哲学家进餐问题是描述死锁最经典的问题,我们后续整个文章都会以此为出发点来讨论,现在先列出来哲学家进餐的问题描述。 问题场景是五个哲学家围绕一个圆桌就做,桌上摆着五只(不是五双)筷子。...哲学家的状态可能是“思考”或者“饥饿”。如果饥饿,哲学家就将拿起他两边的筷子并就餐一段时间。就餐结束,哲学家就会放回筷子。...文章组织 本文主要是讲哲学家进餐问题,因此有必要先回顾一些锁的知识,然后会通过四个版本的程序来解决哲学家进餐问题,最后一个简单的总结。 在这里先说明四个版本的程序有什么区别: 经典的内置锁解决方案。...假设,现在所有的所有哲学家要一起开始吃饭了,他们一起拿筷子,看哲学家0和1,他们会同时来拿0号筷子,这时候只有一个人能拿到,比如说哲学家0拿到了0号筷子,那么哲学家1就只能先等一下,只有哲学家0吃完把0...在上一个版本中,经常会出现只有一个哲学家在进餐,其他在都持有一根筷子并在等另外一根。 在这个版本中,只要一个哲学家在理论上可进餐,那么他肯定就可以进餐。

1.6K40

「JAVA」线程生命周期分阶段详解,哲学家们深感死锁难解

每个线程在创建时都有默认优先级,主线程默认优先级为5,如果A线程创建了B线程,那么B线程和A线程具有相同优先级;虽然Java 中可设置的优先级有10个,但不同的操作系统支持的线程优先级不同的,windows支持的,linux...哲学家就餐问题 哲学家就餐的问题也是一个描述死锁很好的例子,以下是问题描述(内容来源于百度百科): 假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。...哲学家从来不交谈,这就很有可能产生死锁,出现:每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反),永远都吃不到东西,最后饿死。即使没有死锁,也很有可能耗尽服务器资源。...这个策略消除了死锁(系统总会进入到下一个状态),但又会产生新的问题:如果五位哲学家在完全相同的时刻进入餐厅,并同时拿起左边或者右边的餐叉,那么这些哲学家就会同时等待五分钟,同时放下手中的餐叉,又再等五分钟...,哲学家任然会饿死。

53200

《Java-SE-第三十章》之哲学家就餐问题

哲学家就餐问题由Edsger Dijkstra提出的,该问题是一个经典的死锁问题,该问题的基本描述中是指定五个哲学家。...这些哲学家将花部分时间思考,花部分时间就餐。当他们思考的时候,不需要任何共享资源;但当他们就餐时,将使用有限数量的餐具。在问题的原始描述中,餐具是叉子。...要吃到桌子中央盘子里的意大利面条需要用两把叉子,不过把餐具看成是筷子更合理;很明显,哲学家要就餐就需要两根筷子。...问题中引入的难点是:作为哲学家,他们很穷,所以他们只能买五根筷子(更一般地讲,筷子和哲学家的数量相同)。他们围坐在桌子周围,每人之间放一根筷子。...当一个哲学家要就餐的时候,这个哲学家必须同时得到左边和右边的筷子。上述问题会产生死锁的情况,当5个哲学家都拿起自己左或者右手手边的筷子,准备拿右手或者左手边的筷子时产生死锁现象。

12430

linux网络编程之System V 信号量(二):用信号量实现进程互斥示例和解决哲学家就餐问题

short  *array;  /* Array for GETALL, SETALL */     struct seminfo  *__buf;  /* Buffer for IPC_INFO (Linux-specific...输出如下: simba@ubuntu:~/Documents/code/linux_programming/UNP/system_v$ ....二、哲学家就餐问题的描述可以参考这里,下面我们尝试解决这个问题的方法是:仅当一个哲学家两边筷子都可用时才允许他拿筷子。...上图中红色数字表示哲学家的编号,总共5个哲学家,用5个进程来表示;黑色数字表示筷子的编号,总共有5根筷子,可以定义一个信号量集中含有5个信号量,每个信号量的初始值为1,当某个哲学家可以同时得到两根筷子(...如果发现程序没有运行卡着,即没有发生死锁现象,从中也可以发现同时最多只能有两个哲学家一起用餐,也不会出现相邻哲学家一起用餐的情况。 参考: 《UNP》

1.2K00

MIT用GPT-3冒充哲学家,竟骗过了一大半专家

---- 新智元报道   编辑:David Joey 【新智元导读】AI冒充哲学家,成功率有多少?一半的人分不出来。 Daniel Dennett是一位哲学家,最近他有了一个「AI替身」。...哲学家Eric Schwitzgebel、Anna Strasser和Matthew Crosby最近做了一个实验,测试人们是否能分辨出哪些深奥的哲学问题的答案来自Dennett,哪些来自GPT-3。...Schwitzgebel说:"即使是对Dennett本人的作品有一定研究的知识渊博的哲学家,也很难将这GPT-3生成的回答和Dennett本人的回答区分清楚。...这个实验的目的不是要看在Dennett的写作上训练GPT-3,是否会产生一些有智能的「机器哲学家」,也不是一个图灵测试。而是要研究如何能避免被这些「假哲学家」欺骗的问题。

30820

「JAVA」线程生命周期分阶段详解,哲学家们也深感死锁难解

每个线程在创建时都有默认优先级,主线程默认优先级为5,如果A线程创建了B线程,那么B线程和A线程具有相同优先级;虽然Java 中可设置的优先级有10个,但不同的操作系统支持的线程优先级不同的,windows支持的,linux...哲学家就餐问题 哲学家就餐的问题也是一个描述死锁很好的例子,以下是问题描述(内容来源于百度百科): 假设有五位哲学家围坐在一张圆形餐桌旁,做以下两件事情之一:吃饭,或者思考。...哲学家从来不交谈,这就很有可能产生死锁,出现:每个哲学家都拿着左手的餐叉,永远都在等右边的餐叉(或者相反),永远都吃不到东西,最后饿死。即使没有死锁,也很有可能耗尽服务器资源。...,哲学家任然会饿死。...哲学家就餐问题 在实际的计算机问题中,缺乏餐叉可以类比为缺乏共享资源。

83740

ucore-lab7

实际上就是解释ucore的哲学家就餐怎么实现的,内核级别的信号量怎么实现的,之后给出自己关于用户级别的信号量的设计方案,比较两者异同。 关于哲学家就餐问题,不知道为什么,代码里面有注释,中文的。。。...详细可以参考kiprey,他参考了linux的实现。...暑假得抽个空补完这些没有参考的challenge challengen2 扩展练习 Challenge : 参考Linux的RCU机制,在ucore中实现简化的RCU机制 在ucore 下实现下Linux...可阅读相关Linux内核书籍或查询网上资料,可了解RCU的设计实现细节,然后简化实现在ucore中。 要求有实验报告说明你的设计思路,并提供测试用例。...下面是一些参考资料: http://www.ibm.com/developerworks/cn/linux/l-rcu/ http://www.diybl.com/course/6_system/linux

87730

读博那些事儿 | CCF优博、南大蒋炎岩:我的博士五年

哲学家吃饭问题” 是大学时代学习并发编程时的经典难题。现在哲学家们受到盛情的邀请来到舌尖上的中国,面对一桌丰盛的菜肴,他们不再受限于必须同时拿起手边的两根筷子才能用餐,因此可以更尽兴地享用美食。...之后的一天,哲学家们重新聚在一起,试图解决 “哲学家吃中餐问题”:他们各自整理了对那一天吃饭过程的记忆,并试图一起还原出吃饭的完整过程。...Gibbons 和 Korach 在 1997 年对于 “哲学家吃中餐问题” 给出了一个颇为悲观的答案 [1]:如果 P ≠ NP,再聪明的哲学家也无法在多项式时间里恢复出满足顺序一致性的事件排序。...甚至,即便哲学家吃的是火锅 (只有一道菜,即一个变量的情形),NP - 完全性也是成立的。 图 1:“哲学家吃中餐问题” 示意图。...R/W 分别代表读 / 写事件,红色表示满足顺序一致性的线程调度 哲学家和摄像机 “哲学家吃中餐问题” 为什么重要?

2.2K30

CVTE2016春季实习校招技术一面回忆(C++后台开发岗)

问题七: Linux多线程同步方式 ?...问题十: 如何解决哲学家进餐问题? 答: 哲学家进餐问题是由荷兰学者Dijkstra提出的经典的线程和进程间步问题之一。...(2)破坏不可剥夺条件 当哲学家相互等待时,选择一个哲学家作为牺牲者,放弃手中的筷子,这样就保证有一位哲学家可以就餐了。...(3)破坏环路等待条件 解法一:奇数号哲学家先拿他左边的筷子,偶数号哲学家先拿他右边的筷子。这样破坏了同方向环路; 解法二:至多允许N-1位哲学家进餐,将最后一个哲学家停止申请资源,断开环路。...他说有窗体应用程序的后台,Linux环境服务程序的后台,还有两个是什么忘记了。因为鄙人在实验室主要开发都是Linux环境,所以选择了后者。

58211

ucoreOS_lab7 实验报告

这里我使用的是 Linux 下的系统已预装好的 Meld Diff Viewer 工具。...(不需要编码) 在完成本练习之前,先说明下什么是哲学家就餐问题: 哲学家就餐问题,即有五个哲学家,他们的生活方式是交替地进行思考和进餐。...,等待相邻的哲学家释放资源的时候将自己唤醒; 而 phi_put_forks_condvar 函数则是释放当前哲学家占用的叉子,并且唤醒相邻的因为得不到资源而进入等待的哲学家: 首先获取管程的锁; 将自己的状态修改成...Challenge 2 :参考Linux的RCU机制,在ucore中实现简化的RCU机制 待完成。。。...参考资料 http://www.ibm.com/developerworks/cn/linux/l-rcu/ http://www.diybl.com/course/6_system/linux/Linuxjs

1.5K20
领券