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

智能推荐

DNS分离解析-程序员宅基地

文章浏览阅读114次。DNS分离解析包: bind #域名服务包, bind-chroot #提供虚拟根支持服务: named主配置文件: /etc/named.conf #设置本机负责解析的域名地址库文件: /var/named/ #主机名与IP地址的对应关系运行时的虚拟根环境:/var/named/chroot/ #牢笼政策分离解析概述(视图解析)当收到客户机的DNS查询..._dns分离解析匹配客户端来源的字段

第一章-第七题( 有人认为,“中文编程”, 是解决中国程序员编程效率一个秘密武器,请问它是一个 “银弹” 么? )--By 侯伟婷...-程序员宅基地

文章浏览阅读208次。  首先,“银弹”在百度百科中的解释是银色的子弹,我们更熟知的“银弹”一词,应该是在《人月神话》中提到的。银弹原本应该是指某种策略、技术或者技巧可以极大地提高程序员的生产力【1】。此题目中关于中文编程是否是一个“银弹”的讨论,我所持的是否定的态度,我不认为中文编程会是一项提高中国程序员编程效率的一个秘密武器,相反,我还认为他会比现在的英文编程来说降低工作效率,造成很大的工作上的困难。..._存在一种策略,技术技巧可以极大的提高程序员的生产力。

模拟用户操作 京东抢购 华为mate40 Pro、支付的js脚本_京东抢华为脚本-程序员宅基地

文章浏览阅读5.4k次,点赞2次,收藏29次。1 登录 https://item.jd.com/10024680695127.html2 打开开发者模式,插入如下代码,count=1nIntervId=0 stop=0 var goDate function start(){ if (stop==1){ clearInterval(nIntervId);//停止监控 return } if (Date.now() < goDate){ return _京东抢华为脚本

php eayswoole node axios crypto-js 实现大文件分片上传复盘_cryptojs 处理文件过大-程序员宅基地

文章浏览阅读740次。1)前端侧 :前端上传文件,根据分片大小,自动计算出整个文件的分片数量,以及分片二进制文件,以及整个文件的md5值,以及分片文件md5值,传与后端,后端处理完后,根据上传分片的进度以及后端返回状态,判断整个文件是否传输完毕,完毕后,前端展示完成进度。2)后端PHP侧:后端接收前端传过来的数据,包括文件名,文件md5,分片信息,然后将分片文件信息存储到redis 有序集合中,其中key为整个文件的md5 ,待所有分片文件都上传完后,根据顺序,然后将文件整合存储,然后完成整个文件分片上传逻辑。_cryptojs 处理文件过大

VScode 编译器配置IDE环境(C/C++/Go)_vscode 配置 在ide上编译运行-程序员宅基地

文章浏览阅读4.5k次,点赞4次,收藏29次。VScode 编译器配置IDE环境(C/C++/Go)摘要VS Code 下载安装下载安装简单使用WindowsLinuxIDE 环境配置C/C++C/C++ 编译器安装及配置简单使用 VS Code 终端进行编译和运行方式使用code runner插件:Go总结摘要对于 VS Code 的使用,我本人感觉这个编译器还是很好用的,而且目前能够支持在 Windows、Linux、MacOs 上流畅运行,并且官方已经提供了 X86、ARM等主流架构版本,还很容易通过安装插件就能过实现基于 SSH 的远程代_vscode 配置 在ide上编译运行

oracle use_ntl详细解释_oracle中use_nl提示-程序员宅基地

文章浏览阅读1k次。1./*+ use_nl(t2,t) */提示走nest Loop,但是没有提示t2还是t为驱动表2./*+ ordered user_nl(t2,t) */提示走 Nest Loop,order提示的是from 后面的第一个表为驱动表.3./*+ leading(t2) use_nl(t) */直接提示t2为驱动表。结论:use_NL不能让优化器确定谁是驱动表谁是被驱动表。use_nl(t,t2)也没有指出哪个是驱动表,这时候我们就需要使用Ordered ,_oracle中use_nl提示

随便推点

CentOS 7 /lib64/libc.so.6: version `GLIBC_2.18' not found_centos 7 /lib64/libc/.so.6:version 'glibc_2.18' no-程序员宅基地

文章浏览阅读1.9k次。# 如果没有安装gcc的话# yum install gccwget http://ftp.gnu.org/gnu/glibc/glibc-2.18.tar.gztar zxf glibc-2.18.tar.gz cd glibc-2.18/mkdir buildcd build/../configure --prefix=/usrmake -j4make install..._centos 7 /lib64/libc/.so.6:version 'glibc_2.18' not found

php怎么在文字外面加方框,文字或字符加外框(方框、边框)的方法-程序员宅基地

文章浏览阅读2.3k次。文字或字符加外框(方框、边框)的方法2012.4.1512:50本文以方框“囗”里打上勾“√”或叉“×”的方法为例,来叙述文字或字符加外框的方法,下面介绍两种方法。方法一:其实质是“√”或“×”(或其它字符)加方框(更简捷确切说法的是文字加框线的应用)在文档中选取已输入好的欲加方框的“√”或“×”,单击“开始”选项卡→点击“段落”组上的“边框和底纹”按钮(与“*框线”等为同一下拉按钮组中)如下图箭..._怎么用php做一个方框里面有文字

CRM项目-模块一-程序员宅基地

文章浏览阅读1.3k次,点赞3次,收藏4次。模块一:CRM-用户管理1.CRM基本概念CRM 系统即客户关系管理系统, 顾名思义就是管理公司与客户之间的关系。 是一种以"客户关系一对一理论"为基础,旨在改善企业与客户之间关系的新型管理机制。客户关系管理的定义是:企业为提高核心竞争力,利用相应的信息技术以及互联网技术来协调企业与顾客间在销售、营销和服务上的交互,从而提升其管理方式,向客户提供创新式的个性化的客户交互和服务的过程。 其最终目标是吸引新客户、保留老客户以及将已有客户转为忠实客户,增加公司市场份额。CRM 的实施目标就是通过全面提_crm项目

arm 32linux,C语言实现文件pcm转换wav,提供代码实验用PCM音频文件_mp3 to wav c语言-程序员宅基地

文章浏览阅读199次,点赞2次,收藏3次。linux系统C语言音频文件pcm转换wav,提供实验用PCM音频文件_mp3 to wav c语言

JVM详解-栈&堆_jvm 堆栈-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏15次。栈&堆栈栈结构JVM中的栈Java中的栈1、栈里面存放什么2、栈运行原理堆堆(Heap)新生区老年区永久区出现OOMVM options参数栈栈结构栈是一种数据结构。程序=数据结构+算法栈:先进后出,后进先出队列:先进先出(FIFO)Q:为什么main()方法先执行后结束A:先进栈,最后出JVM中的栈Oracle关于栈和栈帧提供了如下描述:每个JVM线程拥有一个私有的 Java虚拟机栈,创建线程的同时栈也被创建。一个JVM栈由许多帧组成,称之为"栈帧"。JVM中的栈和C等常见语言_jvm 堆栈

5、Nacos 、Sentinel、Seata下载与安装_sentinel下载安装-程序员宅基地

文章浏览阅读1.8k次,点赞2次,收藏10次。1、官网:https://nacos.io/zh-cn/index.html2、 下载3、解压安装双击startup.cmdjava.io.IOException: java.lang.IllegalArgumentException: db.num is null如果出现以上错误,需要指令启动:单机模式启动 window版本 startup.cmd -m standalone4、访问登录http://localhost:8848/nacos/index.html#/._sentinel下载安装

推荐文章

热门文章

相关标签