7-5 无饿死互斥_地铁十字转门控制程序java代码-程序员宅基地

技术标签: # 嵌入式——线程同步  多线程  

参考https://blog.csdn.net/booksyhay/article/details/82769005
在这里插入图片描述
在如图中所示的程序中,while语句是一个无限循环; 换句话说,一旦线程离开临界区,它就会循环到顶部并尝试再次获取互斥锁。

想象一下,线程A获取互斥锁,线程B和C等待。 当A离开时,B进入,但在B离开之前,A循环回来加入到队列中和C一起排队. B离开时,无法保证C接下来会执行。 实际上,如果接下来是A,并且B加入队列,那么我们将回到起始点,可以永远重复该循环。 C饿死。

这种模式的存在证明了互斥体容易受到饿死的影响。

解决方案:

使用两个十字转门在临界区之前创建两个等候室。 该机制分两个阶段进行。 在第一阶段期间,第一个旋转门打开而第二个旋转门关闭,因此线程在第二个房间中积聚。 在第二阶段,第一个旋转门关闭,因此没有新线程可以进入,第二个旋转门打开,因此现有线程可以到达临界区。

虽然等候室中可能有任意数量的线程,但这里的每个线程都确保在未来的其他线程到达之前进入临界区。

初始化:
在这里插入图片描述
room1和room2跟踪等候室中的线程数。 mutex有助于保护计数器。 t1和t2是十字转门。

osSemaphoreId_t sem_t1;
sem_t1 = osSemaphoreNew(1, 1, NULL); /*t1旋转门初始化打开*/

osSemaphoreId_t sem_t2;
sem_t2 = osSemaphoreNew(1, 0, NULL);/*t2旋转门初始化关闭*/

osSemaphoreId_t sem_mutex;
sem_mutex = osSemaphoreNew(1, 1, NULL);

int room1 = 0;
int room2 = 0;

线程:
在这里插入图片描述
在进入临界区之前,线程必须通过两个十字转门。这些十字转门将代码划分为三个“房间”。 第28行是1号房间,第618行是2号线,其余的是3号房间。不严格地说,计数器room1和room2跟踪每个房间的线程数。

计数器room1以通常的方式受互斥锁mutex保护,但是room2的保护任务分配在t1和t2中。同样,对临界区进行独占访问的责任包括t1和t2这两个信号量。为了进入临界区,线程必须持有其中的一个,但不能同时持有两个。然后,在退出之前,它会放弃它所持有的任何一个。

while(1)
{
    
	osSemaphoreAcquire(sem_mutex, osWaitForever);
	{
    
		room1++;
		printf("enter room1\r\n");
	}
	osSemaphoreRelease(sem_mutex);

	osDelay(10);	/*等待别的线程进入房间*/

	osSemaphoreAcquire(sem_t1, osWaitForever);  /*关闭t1*/
	{
    
		room2++;
		printf("enter room2\r\n");
		osDelay(10);	/*等待别的线程进入房间*/
		osSemaphoreAcquire(sem_mutex, osWaitForever);
		room1--;

		if(room1 == 0)
		{
    
			printf("open turnstile 2\r\n");
			osSemaphoreRelease(sem_mutex);
			osSemaphoreRelease(sem_t2); /*打开t2*/
		}
		else
		{
    
			osSemaphoreRelease(sem_mutex);
			osSemaphoreRelease(sem_t1); /*打开t1*/
		}
	}

	osSemaphoreAcquire(sem_t2, osWaitForever);  /*关闭t2*/
	{
    
		room2--;
		printf("enter room3\r\n");
	
		//critical_point();

		if(room2 == 0)
		{
    
			printf("open turnstile 1\r\n");
			osSemaphoreRelease(sem_t1); /*打开t1*/
		}
		else
		{
    
			osSemaphoreRelease(sem_t2); /*打开t2*/
		}
	}
}

结论:
在这里插入图片描述

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

智能推荐

代理模式的简单理解_代理模式作用 简洁-程序员宅基地

文章浏览阅读134次。简介代理模式是程序员前辈们总结出来的一种设计模式,它出现的作用是降低程序的耦合度,更利于程序的扩展,它的要求:① 必须有一个接口(抽象主题角色)② 有一个实现类实现这个接口(真实主题角色)③ 然后再来一个实现类也去实现接口(代理主题角色)④ 第二个实现类中持有第一个实现类的对象作为属性⑤ 第二个实现类中也要重写接口的所有抽象方法,但是在重写方法的时候,调用第一个实现类对象的对应方法,..._代理模式作用 简洁

OPENCV2.4.7+VS2010+海康威视摄像头_sadp_lib-程序员宅基地

文章浏览阅读1k次。准备:VS2010,OpenCV2.4.7,海康威视网络PTZ摄像头,Win10操作系统。一.摄像头的安装1.按照说明书安装好摄像头,用网线连接在电脑上,配置电脑IP或者摄像头IP,保证摄像头和电脑在同一个网段,这时摄像头会提醒成功连接网络。2.从海康威视官网上下载SADP并安装(这个版本的SADP我下载下来以后装上了却用不了,后来我就下了比这个低一个版本的,可以使用),按照说明书在S..._sadp_lib

Web前端开发快速学习,0基础前端开发,web前端开发工程师找工作,web开发学什么-程序员宅基地

文章浏览阅读604次,点赞10次,收藏8次。自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。深知大多数前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!因此收集整理了一份《2024年Web前端开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

CentOS系统安装VNC详细步骤_centos如何用vnc-程序员宅基地

文章浏览阅读2k次。下面是总结的详细配置步骤,分享给大家。一、VNC远程控制CentOS系统1、查看CentOS系统中是否有安装vnc(默认安装)输入命令:rpm -q vnc vnc-server如果显示结果为:package vnc is not installedvnc-server-4.1.2-14.e15_3.1说明你机器上已经安装了vnc。如果没有,可以在centOS的软件_centos如何用vnc

datax的使用以及参数解释,快速入门版_datax 参数-程序员宅基地

文章浏览阅读4.8k次,点赞17次,收藏9次。datax的使用以及参数解释,快速入门版_datax 参数

JavaScript(二)——猜数字游戏_javascript猜数字游戏-程序员宅基地

文章浏览阅读1w次,点赞13次,收藏79次。下面我们将会通过一个小案例——猜数字游戏,来直观地感受一下如何让JavaScript完成任务。设计要求假设你的老板给你布置了以下游戏设计任务要求:我想让你开发一个猜数字游戏。游戏应随机选择一个 100 以内的自然数, 然后邀请玩家在 10 轮以内猜出这个数字。每轮后都应告知玩家的答案正确与否,如果出错了,则告诉他数字是低了还是高了。并且应显示出玩家前一轮所猜的数字。一旦玩家猜对,或者用尽所有机会,游戏将结束。游戏结束后,可以让玩家选择再次开始。看到这个要求,首先我们要做的是将其分解成简单的可操作_javascript猜数字游戏

随便推点

ACM--HDOJ 2072--单词数--字符串--水_java acm单词数问题 #结束-程序员宅基地

文章浏览阅读1.2k次。HDOJ题目地址:传送门单词数Time Limit: 1000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 44934 Accepted Submission(s): 10992Problem Descr_java acm单词数问题 #结束

uniapp自定义tabbar必看_uniapp custom-tab-bar-程序员宅基地

文章浏览阅读9.5k次。方式一:实验证明,在根目录下新建custom-tab-bar目录,在目录中新建index.vue是行不通的,vue文件不会被编译方式二:将小程序四大法宝(wxss,json,wxml,js)直接搬过来,虽然tabbar有渲染在小程序上了,但是切换是没有效果的,所以还是行不通方式三(行得通)经过上面的两个尝试,还是乖乖的以vue的做法吧,用单页面的形式,通过v-show控制组件的隐藏和显示注意:v-show有时没有效果,因为v-show是通过display:none来控制的,它的权重没_uniapp custom-tab-bar

树莓派系列-3-连接到树莓派_树莓派 片选接到-程序员宅基地

文章浏览阅读1.3k次。我们用树莓派,估计是没有人会接着屏幕使用的,但是如果有需求也可以使用。如果我们不用屏幕来使用树莓派,那么就得使用SSH、VNC、还有我们的Windows远程工具了。1.SSH 需要在树莓派中开启SSH支持,开启SSH支持有多种方式,这里我就说说我用的,第一种 就是在我们烧写有系统的时候,在boot的分区里面新建一个不带任何后缀的ssh文件,最简单的方式就是新建txt文件,完了重命名为s..._树莓派 片选接到

【毕业设计】STM32化工厂系统-程序员宅基地

文章浏览阅读32次。整个系统以STM32 单片机作为核心控制器,通过DHT11检测温湿度,通过CO传感器检测CO浓度,通过火焰传感器检测火焰,通过红外传感器检测人,通过RFID模块检测刷卡,检测到的数据通过OLED显示并通过无线传输模块上传数据到手机APP,通过继电器控制水阀,通过蜂鸣器报警。

CSS三角、界面样式(cursor、input输入边框不改变颜色、textarea拖拽不改变大小)、vertical-align、溢出文字省略号显示、CSS初始化_html css input::cue-程序员宅基地

文章浏览阅读1.5k次,点赞2次,收藏7次。vertical-align的可选值为:1. bottom: 图片的底线和文字的底线对齐,2. baseline:默认,图片的底线和文字的基线对齐,3. middle: 图片的中线和文字的中线对齐,4. top:图片的顶线和文字的顶线对齐。不同浏览器对有些标签的默认值是不同的,为了消除不同浏览器对HTML文本呈现的差异,所以需要进行CSS初始化。当我们选择input输入框,进行文字输入的时候,边框会改变颜色。textarea默认可以在右下角进行拖拽,改变输入框的大小。CSS初始化参考如下。_html css input::cue

【CS231N】5、神经网络静态部分:数据预处理等-程序员宅基地

文章浏览阅读84次。一、疑问二、知识点1. 白化​ 白化操作的输入是特征基准上的数据,然后对每个维度除以其特征值来对数值范围进行归一化。该变换的几何解释是:如果数据服从多变量的高斯分布,那么经过白化后,数据的分布将会是一个均值为零,且协方差相等的矩阵。该操作的代码如下:# 对数据进行白化操作:# 除以特征值 Xwhite = Xrot / np.sqrt(S + 1e-5)​ 警告:夸大的噪声。注意分母..._人工神经网络系统中的静态数据