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

智能推荐

解析rtcm32报文工具_学习网络请落实这几款小工具-程序员宅基地

文章浏览阅读1.7k次。在实际开发过程中,熟练使用Linux或者Windows中相关网络工具,可以更快更准地找到故障。所以,今天就跟大家分享几个实用的网络利器。1 ncnc-->“瑞士军刀”。不知大家在渗透过程中,拿了shell有没有使用nc搞点事儿。它用来快速构建网络链接,常用来调试客户端程序。nc参数举例执行任务命令扫描机器A端口号在30-40的服务nc -z A 30-40连接服务器A端口号为5000nc -..._rtcm工具

Facebook’s Tectonic Filesystem: Efficiency from Exascale——论文阅读

对Facebook存储系统进行介绍,之前采用多个子系统独自构建存储栈,不同子系统资源需求不同,导致资源没有充分利用。提出Tectonic,用单个系统实现各种用例,避免资源浪费,实现IOPS和存储空间的均衡,满足EB级别,租户间隔离,共享资源等的需求。包括4个部分:Chunk Store,由存储节点组成;Metadata Store,由 KV 存储和文件系统元数据层组成;Client Library,负责编排;Background services,维护集群一致性和容错。详细介绍了各种组件的实现方法。

【DeepL】菜鸟教程:如何申请DeepL免费API并使用Python的DeepL

DeepL是一个基于人工智能的翻译服务,它以其出色的翻译质量和对语境的深入理解而著称。与其他翻译服务相比,DeepL能够提供更加自然、准确的翻译结果,这得益于其先进的深度学习技术和庞大的训练数据集。

数字文旅重塑旅游发展新格局:以数字化转型为突破口,提升旅游服务的智能化水平,为游客带来全新的旅游体验

通过数字化转型和智能化服务的提升,数字文旅为游客带来了全新的旅游体验,推动了旅游业的持续健康发展。数字文旅以数字化转型为突破口,通过提升旅游服务的智能化水平,为游客带来全新的旅游体验,引领旅游业迈向更加智能化、个性化的未来。“方案365”全新整理智慧文旅、智慧园区、数字乡村-智慧农业、智慧城市、数据治理、智慧应急、数字孪生、乡村振兴、智慧乡村、元宇宙、数据中台、智慧矿山、城市生命线、智慧水利、智慧校园、智慧工地、智慧农业、智慧旅游等300+行业全套解决方案。数字文旅的兴起正在重塑旅游发展的新格局。

DRF JWT认证进阶

实际的案例中,登录的方式有很多种,既可以是用户名,还可以是手机号,还可以是邮箱等,并且他们的登录输入入口都是一个,所以这里将实现这种接口用户表用普通的表创建一个数据表用于侧式认证功能username = models.CharField(max_length=64, verbose_name='用户名')password = models.CharField(max_length=64, verbose_name='密码')

使用VSCODE生成调试Linux下C++的CMake项目_vscode cmake 新建linux工程-程序员宅基地

文章浏览阅读1.4k次。以epoll-server项目为例,通过VSCODE编译并调试。该形目由CMake构建,目标在该目录下生成build目录,通过CMake生成Makefile工程到build目录下,然后在build目录下执行make命令进行编译,最后通过VSCODE进行调试。Build代码目录用VSCODE WSL模式打开该目录。在.vscode文件夹下面创建task.json。task.json{ "version": "2.0.0", "tasks": [ {.._vscode cmake 新建linux工程

随便推点

QT入门之QMainWindow-程序员宅基地

文章浏览阅读2.2k次,点赞2次,收藏15次。2 Menu Bar在菜单中栏中,可以添加多个菜单,但是菜单并不负责执行具体的操作,而是在菜单中添加不同的 “动作”(QAction)来完成。在菜单栏中除了添加菜单,还可以直接添加 QAction。2.1 简单示例..._qmainwindow

生日祝福短信_生日祝福短信测试用例-程序员宅基地

文章浏览阅读2.5k次。 1.花朝月夕,如诗如画。祝你生日快乐、温馨、幸福…… 2.但愿真正的快乐拥抱着你,在这属于你的特别的一天,祝你生日快乐! 3.日月轮转永不断,情若真挚长相伴,不论你身在天涯海角,我将永远记住这一天。祝你生辰快乐! 4.让我为你祝福,让我为你欢笑,因为在你生日的今天,我的内心也跟你一样的欢腾、喜悦。祝你快乐!40.难忘是你我纯洁的友情!可贵是永远不变的真情!高兴是能认识你!献上我最_生日祝福短信测试用例

原来10+年的Web前端工程师是这样的,快来围观!_10年前端设计经验-程序员宅基地

文章浏览阅读716次。前端学不动的根本原因是目标感不强或者根本就没有目标。在学习前端之前,我们需要先思考我们要成为一个什么样前端工程师。接下来以时间线的方式,来告诉我们什么时间该做什么事儿。本文以普通人为例,也是想给普通人一些思路,结合自己的情况走出自己的路,超人请自行退出。一、1-3年(P5-P6)这个时候大多数是应届生学习知识的积累期,对于前端三剑客:HTML/Javascript/CSS基础的夯实阶段。推荐《HTML5从入门到精通》,本书是HTML5初学者极好的入门教材之一,内容通俗易懂、由浅入深、循序渐进。另_10年前端设计经验

国学短剧《我是小影星》栏目火热开拍-程序员宅基地

文章浏览阅读72次。节目旨在以中华传统文化为切入点,通过戏剧、歌舞、音乐等多种艺术形式的结合,让孩子们在演绎戏剧的同时,更好地了解和接受中华传统文化的魅力。通过参与国学短剧的表演,小演员们可以更深入地了解和学习中华传统文化和国学知识。通过表演国学短剧,小演员们可以接触到这些思想和价值观,理解它们在现实生活中的意义。在表演过程中,他们需要记住台词,理解角色,并通过身体语言和表情来传达角色的情感。总之,参与国学短剧的表演可以让小演员们更全面地发展自己的才能和能力,同时也可以帮助他们更好地理解和欣赏中华传统文化和国学知识。

深度学习在金融交易中的应用:构建智能投资决策系统

随着人工智能技术的飞速发展,深度学习已经成为金融交易领域中一个强大的工具。通过构建复杂的神经网络模型,我们能够从海量的金融数据中学习并预测市场动向,为投资者提供前所未有的决策支持。

基于Matlab使用深度学习的多曝光图像融合

一、项目背景在图像处理领域,多曝光图像融合技术是一种重要的技术,它可以将不同曝光条件下的多幅图像合并为一幅高动态范围(HDR)图像。这种技术对于改善图像的视觉效果、增强图像的细节和对比度等方面具有重要意义。近年来,随着深度学习技术的快速发展,将深度学习应用于多曝光图像融合领域已成为一个研究热点。本项目旨在利用Matlab平台和深度学习技术,实现高效、准确的多曝光图像融合。二、项目目标构建深度学习模型:基于Matlab深度学习工具箱,构建适用于多曝光图像融合的深度学习模型。

推荐文章

热门文章

相关标签