首页 > 其他分享 >哲学家进餐问题

哲学家进餐问题

时间:2024-11-08 09:34:57浏览次数:1  
标签:进餐 哲学家 吃饭 阻塞 问题 mutex 筷子

哲学家进餐问题

一、问题背景及分析

(一)基本分析及实现

每个进程争抢地使用一种资源,其中若分配不当会导致死锁现象。

image

基本实现:

image

(二)避免死锁发生的三种方法(仍有很多种,这里仅作列举参考)

(1)限制资源容量

可以对哲学家进程施加一些限制条件,比如最多允许四个哲学家同时进餐。这样可以保证至少有一个哲学家可以拿到左右两只筷子。

这里代码实现可将资源数量设置为4。

(2)以奇偶特征分开

要求奇数号哲学家先拿左边的筷子,然后再拿右边的筷子,而偶数号哲学家刚好相反。用这种方法可以保证如果相邻的两个奇偶号哲学家都想吃饭,那么只会有其中一个可以拿起第一只筷子,另一个会直接阻塞。这避免了占有一支后再等待另一只的情况。

(3)仅当一个哲学家左右两只筷子都可用时才允许他抓起筷子

详细见 二、

二、问题实现

image

三、问题思考

(注:对上面的实现的思考)

理解:情景:A 先吃饭

  1. 若另一个相邻的哲学家 B 在 A 仍在 mutex 的 P、V 操作时也想来吃饭,则会因 P 操作阻塞。
  2. 若另一个相邻的哲学家 B 在 A 吃饭时(A 已释放了 mutex 资源)也想来吃饭,则会因其中一个拿起筷子操作阻塞。
  3. 在 2. 的基础上若还有哲学家 C 也想吃饭,则会在 P(mutex) 阻塞(B在占用并处于阻塞状态)
  4. 即 3. 的问题可能导致:明明 C 不在 A 隔壁,且两边都有筷子,却因 P(mutex) 阻塞 (被其他人占用且处于阻塞)而吃不到饭
  5. 同时会带来效率低下等其他问题

标签:进餐,哲学家,吃饭,阻塞,问题,mutex,筷子
From: https://www.cnblogs.com/Wind730/p/18534463/philosopher-dining-problem-z20hcjt

相关文章

  • 读者-写者问题
    读者-写者问题一、问题背景及分析有读者和写者两组并发进程,共享一个文件,当两个或两个以上的读进程同时访问共享数据时不会产生副作用,但若某个写进程和其他进程(读进程或写进程)同时访问共享数据时则可能导致数据不一致的错误。因此要求:允许多个读者可以同时对文件执行读操作只......
  • Mysql使用between and查询时间区间不包括右边界问题
    结论:Mysql数据库中的betweenand查询是包含右边界的,但如果字段是datetime类,数据格式则会被转换为:2018-10-0100:00:00,那么2018-10-01当天的数据就查询不到,所以就会出现不包含右边界的这种问题,而数据类型本身是date则不会出现上述问题。举例:在Mysql中有如下select语句:SELECT*FR......
  • C++解倒三角问题
    题目描述输入一个整数打印数字图形。输入一个整数(0<n<10)输出一个数字图形样例输入 3样例输出 关于本题代码如下:#include<iostream>usingnamespacestd;intmain(){ intn,k,t=1; cin>>n;k=n; for(inti=1;i<=n;i++......
  • c++解修剪花圃问题
    C++解“修剪花圃”题目描述你知道吗?在外国,如果你不修剪你的花圃,是要被贴罚单的。Xman忙于战斗,被贴了好多罚单。这一次好不容易休息了,他决定修剪一下。修剪成什么样子呢?当然是X形。Xman的花圃是一个n*n的正方形,其中n为大于等于3的正奇数。在每个位置上都有几个植物,对应的......
  • 【K8S问题系列】Kubernetes Pod节点CrashLoopBackOff 状态【已解决】
    在Kubernetes中,Pod的状态为CrashLoopBackOff表示某个容器在启动后崩溃,Kubernetes尝试重启该容器,但由于持续崩溃,重启的间隔时间逐渐增加。下面将详细介绍CrashLoopBackOff状态的原因、解决方案及相关命令的输出解释。一、CrashLoopBackOff状态的详细介绍描述C......
  • 【路径规划】基于A*-三次样条曲线求解UAV路径规划问题
    摘要本文提出了一种结合A算法与三次样条曲线的无人机(UAV)路径规划方法。该方法通过A算法找到从起点到终点的最优路径,再利用三次样条曲线对路径进行平滑处理,以确保无人机在复杂地形中实现平稳的导航和避障能力。实验结果表明,基于A*和三次样条曲线的路径规划方法在避免障碍的同......
  • 快速上手Docker部署Flask项目 附常见问题解决
    一、准备Flask项目1.项目结构有一个app.py文件作为主应用程序入口,内容示例:fromflaskimportFlaskapp=Flask(__name__)@app.route('/')defhello_world():return'Hello,World!'if__name__=='__main__':app.run(host='0.0.0.0&#......
  • [题目总结 #1] 静态序列区间查询问题(未完)
    [题目总结#1]静态序列区间查询问题前言不久前遇到一批这种题,我发现自己思路很单一,只想着莫队、分块、线段树,但是其实可能有其他巧妙的做法,而且就算是用分块、线段树维护的东西也有我没想到的。总体来说,在这种题上,自己的思维太固化、自己太依赖思维惯性,又不熟悉各种套路。于是......
  • C++循环引用指的是什么,在使用过程当中需要注意什么问题
    C++中的循环引用是指两个或多个对象相互持有对方的引用,导致这些对象无法被自动释放,从而造成内存泄漏。循环引用主要发生在使用智能指针(如 std::shared_ptr)管理对象生命周期时。以下是循环引用的具体解释及其使用中需要注意的问题:循环引用的形成当两个对象A和B互相持......
  • 前端跨域问题全解:JSONP、CORS 与代理服务器
    在前端开发中,跨域问题常常给开发者带来困扰。当网页应用需要从不同的源(域名、协议或端口)获取数据时,浏览器会因同源策略而限制这种跨域请求。本文将深入探讨前端跨域问题的产生原因以及多种有效的解决方案,并详细介绍其具体实现步骤。一、跨域问题产生的原因浏览器的同源策略是......