哲学家不会吃饭了,我们快来帮帮他们(C语言、进程通信)_哲学家进餐问题c语言实现-程序员宅基地

技术标签: 算法  c++  c语言  操作系统  海小皮操作系统学习记录  嵌入式  

哲学家不会吃饭了,我们快来帮帮他们

皮老师课堂开课啦

皮老师:同学们,今天我们来讨论讨论哲学家吃饭问题,哲学家吃法问题是由大名鼎鼎的Dijkstra提出的,大家看黑板,看看什么是哲学家吃饭问题。


哲学家吃饭问题

每个哲学家面前一碗面条子,每碗面间有一根筷子
哲学家就会干两件事,吃饭、思考
哲学家吃饭的时候要依次把左右两侧的筷子拿起来(不分次序)才能吃面
吃完了把筷子放回去继续思考


皮老师:如何才能不发生死锁呢?

张三同学抢答:拿不到筷子就等着呗,等别旁边的吃完了不就拿到了么?

皮老师:假如五个人都同时拿起了自己左侧的筷子,哲学家全都饿死也不会吃到面条!这就是死锁了!我们拿一段代码来体会一下

void philosopher(int i)// i 为哲学家编号 0-4
{
    
	while(1)
	{
    
		think();// 思考
		take_fork(i);// 拿左边筷子(拿不到就阻塞)
		take_fork((i+1)%N);// 拿右边筷子(拿不到就阻塞)
		eat();// 吃面条子
		put_fork(i);// 放筷子
		put_fork((i+1)%N);
	}
}

李四同学站了起来:那我先拿起左边的,看看右边有没有,右边没有我就把左边的筷子放回去,等会再重复一遍,直到拿到右边的筷子。

皮老师:李四同学,你和张三同学犯了相同的错误,如果五个哲学家执行相同的步骤,此时他们同时拿起了左边的筷子,都发现右边没有筷子,全都把左边的筷子放下,一会又同时拿起了左边的筷子又放下,这就出现了饥饿(starvation)

王五同学有话说:那就让每个人等待的时间是随机的就行了!

皮老师:很好很好,看来王五同学很懂嘛!我们的网络通信中就有类似的解决之道。两个终端同时向一个总线上发送数据包,会发生碰撞,这时两个终端都会停止发送,等待一个随机的时间重新发送!这种办法在大部分的应用中都是可行的,但在一些军事场合或核电站安全控制场合,这些场合是要求高实时性的,随机数字带来的错误可能是致命的!上面的症结都出现在同时拿筷子这件事上,那么我们就不让哲学家同时拿筷子,这不就是临界区问题嘛,下面我给大家将一个在前面基础上改进的思路,既不会死锁也不会饥饿,不过这用到了我们之前有关信号量的知识。

信号量相关的知识忘记的话可以点击传送门复习一下_

下面我们上一段代码

#define N 5
#define LEFT(i) (i+N-1)%N //i 哲学家左侧的哲学家编号
#define RIGHT(i) (i+1)%N //i 哲学家右侧的哲学家编号
#define THINKING 0 //思考状态
#define HUNGRY 1 //饥饿状态,试图拿起筷子
#define EATING 2 //吃面条状态
typedef int semaphore; //信号量的类型定义
int state[N]; //跟踪哲学家状态
semaphore mutex = 1; //临界区互斥量
semaphore s[N]; //每个哲学家一个信号量

void philosopher(int i)
{
    
	while(1);
	{
    
		think();// 思考
		take_fork(i);// 拿左边筷子
		take_fork((i+1)%N);// 拿右边筷子
		eat();// 吃面条子
		put_fork(i);// 放筷子
		put_fork((i+1)%N);
	}
}

void take_fork(int i)
{
    
	down(&mutex); //检查互斥量,进入临界区
	state[i] = HUNGRY; //记录饥饿状态
	test(i); //尝试获取第二把筷子
	up(&mutex); //离开临界区
	down(&s[i]); //不可以吃饭就sleep
}

void put_fork(int i)
{
    
	down(&mutex); //进入临界区
	state[i] = THINKING; //就餐完毕开始思考
	test(LEFT(i)); //把左边筷子放下,并让左边的兄弟看看能吃了么
	test(RIGHT(i)); //把右边筷子放下,并让右边的兄弟看看能吃了么
	up(&mutex); //退出临界区
}

void test(int i)
{
    
	if(state[i] == HUNGRY && state[LEFT(i)]!=EATING && state[RIGHT(i)]!=EATING)
	{
    
		state[i] = EATING;
		up[&s[i]]; //可以吃饭,如果sleep了就唤醒
	}
}

皮老师:同学们仔细研究研究,不懂的在课后讨论组讨论吧!

这里是海小皮!我们一同进步!!

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_42464904/article/details/114326350

智能推荐

MySQL数据库管理基本操作(一)_myi-程序员宅基地

文章浏览阅读229次。目录一、数据库基本操作1.1 登录数据库1.2 查看数据库结构查看数据库信查看数据库中包含的表结构显示数据表的结构1.3 常用的数据库类型1.4 char和varchar的区别二、MySQL数据文件2.1 MYD文件2.2 MYI文件2.3 MyISAM存储引擎三、SQL语句3.1DDL数据定义语言创建新的数据库创建新的表删除指定的数据表删除指定的数据库3.2 DML数据操控语言向数据表中插入新的数据记录查询数据记录_myi

【计算思维】第14届蓝桥杯省赛计算思维U8组真题试卷_计算思维u8省赛-程序员宅基地

文章浏览阅读1.3k次,点赞23次,收藏21次。70 个小朋友参加夏令营活动,老师们组织小朋友做游戏,让他们站成一排,从 1 开始顺序报数,报奇数的 小朋友出局;剩下的小朋友位置不变,再次从 1 开始报数,报奇数的出局......按照这个规则继续下去,直 到剩一个小朋友为止。维维坐在第 1 列火车的 10 号车厢,奇奇坐在第 2 列火车的 10 号车厢。当维维和奇奇正好相遇时,第 1 列 火车的 14 号车厢,与第 2 列火车的( )号车厢相遇。下图中每个圆圈代表一个小朋友。将一个表面涂有颜色的正方体,分割成同样大小的 27 个小正方体,如下图所示。_计算思维u8省赛

记录配置Visual Studio 2022环境变量以及找不到nmake.exe文件的问题_未找到文件nmake-程序员宅基地

文章浏览阅读2.1k次,点赞3次,收藏7次。作者:奇版权:本作品采用「」许可协议进行许可。_未找到文件nmake

MongoDB索引详解-03-程序员宅基地

文章浏览阅读3.9k次,点赞2次,收藏5次。索引是一种用来快速查询数据的数据结构。B+Tree就是一种常用的数据库索引数据结构,MongoDB采用B+Tree 做索引,索引创建在colletions上。MongoDB不使用索引的查询,先扫描所有的文档,再匹配符合条件的文档。使用索引的查询,通过索引找到文档,使用索引能够极大的提升查询效率。按照索引包含的字段数量,可以分为单键索引和组合索引(或复合索引)。按照索引字段的类型,可以分为主键索引和非主键索引。按照索引节点与物理记录的对应方式来分,可以分为聚簇索引和非聚簇索引,其。_mongodb索引

在 Elasticsearch 中删除索引的语法是什么?_elasticsearch删除索引数据-程序员宅基地

文章浏览阅读190次。请注意,在实际操作前,请确保你已经正确备份了要删除的数据,因为删除索引操作不可逆。此外,如果需要删除所有索引(这是一项非常危险的操作,应当极其谨慎),可以使用。例如,如果你想要删除名为。_elasticsearch删除索引数据

如何写出一份优秀的PRD-文档篇_在线教育prd文档-程序员宅基地

文章浏览阅读285次。要用“作为一个用户(As a user),我希望(I want)什么功能,以(so that)满足什么商业价值“的标准格式描述,以讲清楚该需求的目标用户、功能和价值。一个功能设计是否合理,能否被设计和开发团队读懂,设计、开发出满足用户需求和业务需求的产品,都要依赖需求描述的合理性。如果有专业的交互设计师,这反而是对他设计的一种限制,以你的不专业影响了他的专业。上回讲到PRD撰写前的准备工作,包括摸清PRD的目标用户的习惯,深入了解本次用户的需求,根据INVEST和MVP原则、按照业务流程做功能拆分。_在线教育prd文档

随便推点

python输入出生日期和当前日期计算年龄_根据当前日期及出生日期,计算当前年龄(function)...-程序员宅基地

文章浏览阅读4.6k次。create or replace function F_GET_NL_BY_CSRQ(csrq date, v_date date)return number/** 根据出生日期和日期,计算当时的年龄*/asv_yr1 char(4);v_yr2 char(4);beginbeginv_yr1 := to_char(v_date,'mmdd');if csrq is not null thenv..._创建子vi计算年龄,出生日期和当前日期作为输入。用三个独立的整形控件来输入日期:

关于layuiAdmin 后台管理模板购买授权的问题_layuiadmin怎么购买-程序员宅基地

文章浏览阅读1.4w次,点赞3次,收藏2次。购买授权之前,建议认真阅读下述 “解惑”,以免造成不必要的困惑。另外也可以阅读 《layui 付费产品服务条款》注意:layuiAdmin 受国家计算机软件著作权保护(登记号:2018SR410669),不得恶意分享产品源代码、二次转售等,违者必究。应该如何选择版本?通常我们推荐您选择“套餐版”,它同时包含了“单页版”和“iframe版“”,你随时可根据项目需求和团队情况,自由切换。但如果你..._layuiadmin怎么购买

Android软键盘弹出不影响布局的方法_android 虚拟键盘弹出收回不影响布局-程序员宅基地

文章浏览阅读2.3k次。【转载】http://geyubin.iteye.com/blog/1297637在原有的基础上根据原始文档的说明,对其中的翻译进行了修订,以便读起来更顺畅,更容易理解。attributes:android:windowSoftInputModeActivity如何与软键盘交互。这个属性的设置会影响两件事情:软键盘的状态——隐藏或显示——当活动(Activi_android 虚拟键盘弹出收回不影响布局

精神病人思维广 ——读《天才在左,疯子在右有感》_天才在左疯子在右时间静止-程序员宅基地

文章浏览阅读1.9k次。请容许我用这么一句调侃的语句来作为本篇文章的标题,因为看了这本书后我强烈的感受到了这句话。本书实际上是访谈笔记,只不过访谈的对象比较特殊——精神病人,他们有着天马行空的思想,超强的逻辑思维让我这个程序员感到惭愧,不得不赞叹一声:精神病人就是思维广! 一个月前读完本书,现在回想起来,脑袋里不停冒出几个词:四维虫子、生化奴隶、玛雅文明等,简单的词语里包含着丰富而且又匪夷所思的内容,下面_天才在左疯子在右时间静止

基于微信小程序餐厅点餐系统设计与实现(源码+lw+部署文档+讲解等)-程序员宅基地

文章浏览阅读353次,点赞8次,收藏12次。博主介绍:全网粉丝10W+,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java、小程序技术领域和毕业项目实战精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐Java精品实战案例《500套》微信小程序项目精品案例《500套》文末获取源码+数据库。

Django入门_通过什么语句把我们新定义的app加到settings.py中的install_apps中-程序员宅基地

文章浏览阅读1.1k次。前几天看了Python的一些基础知识,然后又了解了一下相关的web框架,比较主流的有Django和Flask,比较了一下之后决定学Django,基础供能比较完善,对于初学者应该更友好一些。一边跟着大神的博客做,一边整理了这篇博客,没什么新的东西,只是我个人的学习笔记,其中一些部分我专门修改成不太一样的东西,以免学习过程中不求甚解的忽略。总的来说大神这篇博客非常不错,如果你是刚学习了Python的基础_通过什么语句把我们新定义的app加到settings.py中的install_apps中