哲学家就餐问题

news2024/9/20 18:35:39

哲学家就餐问题是一个著名的一类同步问题,在并发编程领域,常用来解释线程同步的问题。

问题描述:五位哲学家围坐在一张圆桌旁,每个哲学家面前有一碗米饭和一只筷子。这五个哲学家都是苦于无法同时持有两只筷子,因为只有当他们拿到两只筷子时才能进食,因此他们时刻面临着这样的问题:如果从左边拿起一只筷子,在等待右边的筷子时,等待时间过长,米饭可能凉掉。如果每个哲学家都等待右边的筷子,那么所有哲学家都将陷入死锁,无法进食。

如何设计一个算法来避免死锁的情况,允许哲学家来进食呢?

图如下:

各种解答方法:

1.资源分配法:保证每个哲学家都有足够的资源,即筷子。避免死锁的方法是保证不会出现所有人想要拿到右边或左边的筷子。

2.时间限制法:约定一个时间限制,哲学家在规定时间内必须把筷子放回去,否则强行让他放筷子。

3.基于信号量:给每一只筷子都建立一个可用性的信号量,当哲学家需要筷子时就会试图“申请”信号量,如果可用则得到信号量掌控筷子,否则该申请被阻塞。

4.设定优先级:为了避免死锁状态,哲学家们可以对筷子数量、进餐时间、可以阻止饥饿状态的优先级等限制加以控制。

5.环状尝试法:为顺时针某一定序列的哲学家设置等待限制,阻止所有哲学家同时拿到右边筷子。比如规定每个哲学家只能先等待左边的筷子,而不能同时等待左右两边的筷子。 

这类问题的解答方法很多,主要在于结合具体情况、场景和问题要求,再采取相应策略,常用的有上述这些方法。


我的想法:

1.首先每次只能一个哲学家进食,这样就可以避免死锁问题,但是效率也很低。实现方法是在程序中加入互斥量,这样只要有一个哲学家进入了「临界区」,也就是准备要拿筷子时,其他哲学家都不能动,只有这位哲学家用完叉子了,才能轮到下一个哲学家进餐。

2.5个筷子明显可以满足两个哲学家,我的想法是让奇数序号的哲学家拿筷子,奇数哲学家吃完再让偶数序号的哲学家吃。但是要考虑哲学家的数量,如果总数是奇数,则最后一个奇数哲学家拿不到两个筷子,如上图,奇数哲学家为1,3,5。而5显然拿不到两双筷子!第二个想法明显由于方案一。实现方法是用信号量机制,PV操作就行了。

方案二应该是最优的方案!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/660112.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Autosar软件组件-Application Layer介绍和SWC(Software Component)类型

参考前文Autosar-软件架构,可知整个架构从上到下分层依次为:应用层(Application Software Layer),运行时环境(Runtime Environment,RTE),基础软件层(Basic Software Layer,BSW),微控制器(Microcontroller)。 Application Layer由各种AUTOSAR Software Componen…

【备战秋招】每日一题:华东师范大学保研机试-2022-整数排序

为了更好的阅读体检,可以查看我的算法学习博客华东师范大学保研机试-2022-整数排序 题目内容 输入若干个int类型整数,将整数按照位数由大到小排序,如果位数相同,则按照整数本身从小到大排序。 例如, 输入:10 -3 1 23 89 100 9…

【第四次】21级计科计算机组成原理课外练习

【第四次】21级计科计算机组成原理课外练习 一、判断题二、单选题三、多选题四、填空题五、程序填空题 一、判断题 1-1 设机器数字长8位(含1位符号位),若机器数BAH为原码,算术右移一位得到的结果为 9D H 。 T F 1-2 ALU中采用双…

spring 反射,BigDecimal,自定义注解的使用(aop)

反射 利用反射调用它类中的属性和方法时&#xff0c;无视修饰符。 获取Class类的对象&#xff08;三种方式&#xff09; Class.forName(“全类名”) &#xff08;推荐使用&#xff09;类名.class对象.getClass() 反射获取构造方法Constructor<?>[] getConstructors()…

Android 逆向之脱壳实战篇

作者&#xff1a;37手游安卓团队 前言 这篇文章比较干&#xff0c;比较偏实战&#xff0c;看之前建议先喝足水&#xff0c;慎入。 在学脱壳之前&#xff0c;我们先来复习一下&#xff0c;什么时候是加固&#xff1f; 加固本质上就是对 dex 文件进行加壳处理&#xff0c;让一些…

信号三大阶段之储存信号

目录 一、 信号三大阶段 二、信号储存相关概念 三、 理解概念 四、信号储存原理 五、信号集操作函数 一、 信号三大阶段 二、信号储存相关概念 实际执行信号的过程被称为信号递达&#xff08;Delivery&#xff09;。信号从产生到递达之间的状态被称为信号未决&#xff08;…

【Linux】初步认识Linux系统

Linux 操作系统 主要作用是管理好硬件设备&#xff0c;并为用户和应用程序提供一个简单的接口&#xff0c;以便于使用。 作为中间人&#xff0c;连接硬件和软件 常见操作系统 桌面操作系统 WindowsmacOsLinux 服务器操作系统 LinuxWindows Server 嵌入式操作系统 Linux …

从零搭建一台基于ROS的自动驾驶车-----1.整体介绍

系列文章目录 北科天绘 16线3维激光雷达开发教程 基于Rplidar二维雷达使用Hector_SLAM算法在ROS中建图 Nvidia Jetson Nano学习笔记–串口通信 Nvidia Jetson Nano学习笔记–使用C语言实现GPIO 输入输出 Autolabor ROS机器人教程 文章目录 系列文章目录前言一、小车底盘二、激…

Redis入门(三)

第5章 Redis的相关配置(redis.conf) 1&#xff09;计量单位说明,大小写不敏感 # 1k > 1000 bytes # 1kb > 1024 bytes # 1m > 1000000 bytes # 1mb > 1024*1024 bytes # 1g > 1000000000 bytes # 1gb > 1024*1024*1024 bytes # # units are case insensiti…

如何安装Apache服务

目录 什么是Apache 第一步 关闭防火墙和安全机制 第二步 系​统​上​定​义 SELinux 最​高​级​别 第三步 导入对应的依赖包并解包 第四步 安装依赖环境 第五步 移动相关文件 第六步 编译安装 第七步 编译 第八步 备份配置文件 第九步 优化执行路径 第十步 添加…

S32K324芯片学习笔记-实时控制系统-eMIOS

文章目录 Enhanced Modular IO Subsystem (eMIOS)eMISO配置通道类型通道配置BCTU Interface 简介功能框图Unified channels (UC)Buffered modesUC control and datapath diagramUC modesGPIO模式SAIC (Single Action Input Capture)模式Single Action Output Capture (SAOC) mo…

AI自动写代码:GitHub copilot插件在Idea的安装和使用教程

GitHub Copilot 是微软与OpenAI共同推出的一款AI编程工具&#xff0c;基于GitHub及其他网站的源代码&#xff0c;根据上文提示为程序员自动编写下文代码&#xff0c;可以极大地提高编写代码的效率。 先看看ChatGpt是怎么回答Copilot的功能特点&#xff1a; 给大家简单提取一…

【go】新手go module 踩坑入门rc_server

go1.3 后废弃了GOPATH 但是gomodule 要自己设置 :go env -w GO111MODULE=auto Microsoft Windows [版本 10.0.22621.1848] © Microsoft Corporation。保留所有权利。 C:\Users\zhangbin>adb connect 127.0.0.1:7555 connected to 127.0.0.1:7555 C:\Users\zhangbin&…

【计算机通识】未来的计算机

欢迎来到博主 Apeiron 的博客&#xff0c;祝您旅程愉快 &#xff01; 时止则止&#xff0c;时行则行。动静不失其时&#xff0c;其道光明。 目录 1、缘起 2、未来的计算机 2.1、光子计算机 2.2、生物计算机 2.3、量子计算机 3、总结 1、缘起 自然界中的一切事物都是处…

3d重建+神经渲染

3d重建 基于深度相机(结构光、TOF、双目摄像头)的三维重建基于图像的三维重建&#xff1a;深度学习基于视觉几何的传统三维重建&#xff1a;这种三维重建方法研究时间比较久远&#xff0c;技术相对成熟。主要通过多视角图像对采集数据的相机位置进行估计&#xff0c;再通过图像…

经典同步问题之哲学家就餐

文章目录 一&#xff1a;问题描述方案一&#xff1a;方案二&#xff1a;方案三&#xff1a; 一&#xff1a;问题描述 五个哲学家共用一张圆桌&#xff0c;分别坐在周围的五张椅子上&#xff0c;在圆桌上有五个碗和五只筷子&#xff0c;他们的生活方式是交替的进行思考和进餐。…

2023年测试岗前景?为什么要做自动化测试?8年测试总结...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 自动化测试是把以…

Web网页制作期末复习(2)——常用文本标签、列表标签、表格标签、Form表单、块元素与行内元素(内联元素)

目录 常用文本标签 列表标签 有序列表 无序列表 定义列表 表格标签 表格组成与特点 表格标签 表格属性 ​​​合并表格单元格 Form表单 属性说明 表单元素 文本框 密码框 提交按钮 块元素与行内元素&#xff08;内联元素&#xff09; 内联元素和块级元素…

3、DuiLib了解xml的使用和布局

文章目录 1、了解 XML 使用和布局2、VerticalLayout和HorizontalLayout3、TabLayout4、TileLayout5、Container6、ChildLayout 1、了解 XML 使用和布局 本节主要介绍 DuiLib 中 XML 关键字的使用和一些特性&#xff0c;通过构建一个简单的带标题栏和简单结构的窗口&#xff0c…

模型分享---登陆注册界面

目录 模型---登陆注册界面 验证码的生成&#xff1a; CheckCodeUtil.java&#xff1a; Servlet: 普通用户登陆&#xff1a; css: jsp: 运行结果&#xff1a; 管理员登陆&#xff1a; 运行结果&#xff1a; 注册&#xff1a; 普通用户&#xff1a; css: jsp: 运行…