首页 > 其他分享 >独木桥问题——读写问题变形

独木桥问题——读写问题变形

时间:2024-11-04 21:08:33浏览次数:2  
标签:信号量 独木桥 读写 问题 互斥 过桥 mutex count2 whetherY

有一座东西方向的独木桥,请分别用PV操作实现以下3个要求:

  1. 每次只允许一个人过桥;
  2. 当独木桥上有行人时,同方向的行人可以同时过桥,相反方向的人必须等待;
  3. 当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,从西向东的方向只允许一个人单独过桥;

是读者写者问题的变形
(1)使用mutex互斥信号量控制对共享资源桥的访问,信号量初始值为1,以两个进程分别来表示不同的过桥方向

semaphore mutex = 1;

Process EastToWest()
{
	while(1)
	{
		P(mutex);
		eastToWest;			// 东到西过桥
		V(mutex);
	}
}

Process WestToEast()
{
	while(1)
	{
		P(mutex);
		westToEast;			// 西到东过桥
		V(mutex);
	}
}

(2)使用互斥mutex信号量控制对桥的访问,使用whetherY来控制同向访问信号量,使用whetherN来控制反向信号量,这三个信号量的初始值都应该未1。使用进程Yes()来模拟与桥上行人同向过桥行为,进程No()来模拟桥上人过桥方向相反的过桥行为,代码如下:

// 桥上有人,同方向同时过桥,反向等待
int n1=n2=0;
int count1 = n1;		// 同向行人计数
int count2 = n2;		// 反向行人计数
semaphore mutex = 1;   	// 互斥访问桥
semaphore whetherY= 1; 	// 同向互斥信号量,保证count1
semaphore whetherN= 1;  // 反向互斥信号量,保证count2
//同向
Process Yes()
{
	while(1)
	{
		P(mutex);
		P(whetherY);
		count1++;
		if(count1==1)
			P(mutex);
		V(whetherY);
		count1PeopleCrossBridge;		// 同向过桥	
		P(whetherY);
		count1--;
		if(count1==0)
			V(mutex);
		V(whetherY);
	}
}
//反向
Process No()
{
	while(1)
	{
		P(whetherN);
		count2++;
		if(count2==1)
			P(mutex);
		V(whetherN);
		count2PeopleCrossBridge;		// 反向过桥
		P(whetherN);
		count2--;
		if(count2==0)
			V(mutex);
		V(whetherN);
	}
}

(3)使用互斥信号量mutex控制对桥的互斥访问,使用whether信号量来控制是否是自东向西的信号量,使用count来计数自东向西的过桥人数。

// 当独木桥上有自东向西的行人时,同方向的行人可以同时过桥,
// 从西向东的方向只允许一个人单独过桥

int count = 0;						// 计数器
semaphore mutex = 1;				// 互斥信号量
semaphore weatehr = 1;
Process EastToWest()
{
	while(1)
	{
		P(whether);
		count++;
		if(count==1)
			P(mutex);
		V(whether);
		CrossBridge;
		P(whether)
		count--;
		if(count==0)
			V(mutex);
		V(whether);
	}
}

Process WestToEast()
{
	while(1)
	{
		P(mutex);
		CrossBridge;
		V(mutex);
	}
}

标签:信号量,独木桥,读写,问题,互斥,过桥,mutex,count2,whetherY
From: https://www.cnblogs.com/notebox/p/18526369

相关文章

  • 初学elasticsearch——除了CRUD之外我还需要关注es的哪些问题
    1.倒排索引是如何工作的倒排索引中主要有词条和文档两个概念:词条是分词后产生的词语,每条数据都有对应的文档(被序列化好的json串)倒排索引就是把词条、文档ID记录下来,每当出现一个重复的词条都会追加在文档ID如下图,词条是不会重复的 在查询的时候,我们会先对搜索内容进行分词,根......
  • 关于Pycharm 2024 激活出现的问题
    下载好专业版之后,如何激活?搜索了大量的文章,发现主要有两类:第一种如下(可行):在网上搜索到激活文件夹,找到jetbra文件,如下所示:然后点击其中的scripts文件夹,双击install-current-user.vbs,进行激活。会出现以下页面,选点击确定,等待30s-60s,会出现完成的提示到这里完成初步激活,然......
  • 解决pycharm中安装包之后却用不了的问题
    一起因    这几天,我接触了selenium,然后在pycharm当中下载了selenium,结果可想而知,报错了,然后我在网上查到解决的办法,想着会对大家有帮助,就分享给大家,其他的包也可以这样做二解决办法        首先输入pipshow(你的包名),然后就可以看到location......
  • math.js 处理数据精度等问题
    math.js是一个用于Javascript和Node.js的广泛数字库。它具有一个灵活的表达式解析器,支持符号计算,带有大量内置函数和常量,并提供一个集成解决方案来处理不同的数据类型,如数字、大数、复数、分数、单位和矩阵。功能强大且易于使用。特征:支持数字、大数、bigint、复数、分数、单位......
  • 大模型解决长文本输入问题
    前段时间,不知道为什么Kimi突然在各大平台爆火,dyb站都能看到它的身影。抱着试试看的态度,我也去体验了一下Kimi的效果,我只能说一言难尽。。。。。。国产模型我还是回去用通义千问吧哈哈哈哈哈。圆规正转,今天想聊的是Kimi的“护城河”--大模型如何来解决长上下文输入问题。前......
  • Spring Boot代理问题
    在SpringBoot2.x中,AOP(面向切面编程)默认使用CGLIB(CodeGenerationLibrary)来实现类的代理。CGLIB代理是通过在运行时生成目标类的子类来增强目标类的方法。这种方式允许对没有实现接口的类进行代理。以下是一些原因和机制解释,说明为什么Spring在AOP中默认使用CGLIB。......
  • 如何解决跨域问题?
    目录1、同源策略2、跨域实例演示3、跨域解决办法①、response添加header②、JSONP方式③、HttpClient请求转发④、nginx转发如何解决跨域问题?首先我们需要知道什么是跨域,跨域指的是浏览器不能执行其它网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript施加的安......
  • 解决 Unexpectedlexicaldeclarationincaseblock的问题
    亲测可用,若有疑问请私信使用新版的es-lint的时候扫描旧的项目,发现报了Unexpectedlexicaldeclarationincaseblock(no-case-declarations)这么一个错误提示当时很奇怪,就去查了一下文档,发现中文文档中解释比较简单该规则禁止词法声明(let、const、function和class)出......
  • JAVA工作经验4-5年一般会面试什么问题?
    JAVA工作经验4-5年面试会问的问题如下:不多bb,来看文档内容面试总结一共有三份,内容涵盖Java基础、JVM、多线程、Mysql、Spring、SpringBoot、SpringCloud、Dubbo、Mybatis、网络、Linux、MQ、Zookeeper、Netty、大数据、算法、项目方面以及设计模式等方面的面试真题。篇幅限......
  • 华为云开源时序数据库openGemini:使用列存引擎解决时序高基数问题
    本文来源:《华为云DTSE》第五期开源专刊,作者:向宇,华为云数据库高级研发工程师、黄飞腾,博士,openGemini存储引擎架构师在时序数据场景中,大部分的解决方案是以时间线为粒度对时序数据进行管理,这类解决方案在时间线数量不断增长的情形下,面临着诸多困难,包括内存膨胀、读写性能下降等,华为......