互斥量保护资源

news2024/10/7 4:34:16

一、概念
 

在多数情况下,互斥型信号量和二值型信号量非常相似,但是从功能上二值型信号量用于同步,
而互斥型信号量用于资源保护。
互斥型信号量和二值型信号量还有一个最大的区别,互斥型信号量可以有效解决优先级反转现
象。
优先级反转:
系统中有 3 个不同优先级的任务 H/M/L ,最高优先级任务 H 和最低优先级任务 L 通过 信号量机制,共享资源。目前任务L 占有资源,锁定了信号量, Task H 运行后将被阻塞,直到 Task L释放信号量后, Task H 才能够退出阻塞状态继续运行。但是 Task H 在等待 Task L 释放信号量的过程中,中等优先级任务M 抢占了任务 L ,从而延迟了信号量的释放时间,导致 Task H 阻塞了更长时 间,这种现象称为优先级倒置或反转。
优先级继承:当一个互斥信号量正在被一个低优先级的任务持有时, 如果此时有个高优先级的任
务也尝试获取这个互斥信号量,那么这个高优先级的任务就会被阻塞。 不过这个高优先级的任务
会将低优先级任务的优先级提升到与自己相同的优先级。
优先级继承并不能完全的消除优先级翻转的问题,它只是尽可能的降低优先级翻转带来的影响。

二、没有使用互斥量的时候

 配置中、高、低三个优先级

  

  osThreadDef(TaskH, StartTaskH, osPriorityAboveNormal, 0, 128);
  TaskHHandle = osThreadCreate(osThread(TaskH), NULL);


  osThreadDef(TaskM, StartTaskM, osPriorityNormal, 0, 128);
  TaskMHandle = osThreadCreate(osThread(TaskM), NULL);

 
  osThreadDef(TaskL, StartTaskL, osPriorityBelowNormal, 0, 128);
  TaskLHandle = osThreadCreate(osThread(TaskL), NULL);

void StartTaskH(void const * argument)
{

  for(;;)
  {
		xSemaphoreTake(myBinarySemHandle,portMAX_DELAY);
		printf("TaskH:我开始进入厕所,发功中。。\r\n");
		HAL_Delay(1000);
		printf("TaskH:我上完厕所了,真舒服。。。\r\n");
		xSemaphoreGive(myBinarySemHandle);
    osDelay(1000);
  }
}

void StartTaskM(void const * argument)
{
  for(;;)
  {
		printf("TaskM:我就是为了占用资源,带女朋友兜风\r\n");
		
    osDelay(1000);
  }
}

void StartTaskL(void const * argument)
{
  for(;;)
  {
		xSemaphoreTake(myBinarySemHandle,portMAX_DELAY);
		printf("TaskL:我开始进入厕所,发功中。。\r\n");
		HAL_Delay(3000);
		printf("TaskL:我上完厕所了,真舒服。。。\r\n");
		xSemaphoreGive(myBinarySemHandle);
    osDelay(1000);
  }
}

 

 

互斥量实验(接上半部分)

首先删除二值信号量

 创建互斥量

 

void MX_FREERTOS_Init(void) {
 
  osMutexDef(myMutex);
  myMutexHandle = osMutexCreate(osMutex(myMutex));

  
  osThreadDef(TaskH, StartTaskH, osPriorityAboveNormal, 0, 128);
  TaskHHandle = osThreadCreate(osThread(TaskH), NULL);


  osThreadDef(TaskM, StartTaskM, osPriorityNormal, 0, 128);
  TaskMHandle = osThreadCreate(osThread(TaskM), NULL);


  osThreadDef(TaskL, StartTaskL, osPriorityBelowNormal, 0, 128);
  TaskLHandle = osThreadCreate(osThread(TaskL), NULL);


}

void StartTaskH(void const * argument)
{
 
  for(;;)
  {
		xSemaphoreTake(myMutexHandle,portMAX_DELAY);//句柄变为myMutexHandle
		printf("TaskH:我开始进入厕所,发功中。。\r\n");
		HAL_Delay(1000);
		printf("TaskH:我上完厕所了,真舒服。。。\r\n");
		xSemaphoreGive(myMutexHandle);
    osDelay(1000);
  }
  
}

void StartTaskM(void const * argument)
{
 
  for(;;)
  {
		printf("TaskM:我就是为了占用资源,带女朋友兜风\r\n");
		
    osDelay(1000);
  }

}


void StartTaskL(void const * argument)
{
 
  for(;;)
  {
		xSemaphoreTake(myMutexHandle,portMAX_DELAY);
		printf("TaskL:我开始进入厕所,发功中。。\r\n");
		HAL_Delay(3000);
		printf("TaskL:我上完厕所了,真舒服。。。\r\n");
		xSemaphoreGive(myMutexHandle);
    osDelay(1000);
  }

}

运行结果:

 通过引入互斥量,可以实现资源的保护功能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1211668.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Spring Cloud Netflix微服务组件-Eureka

CAP理论 分区容忍是能容忍一个或一部分节点挂掉后,整体系统也能正常工作(就是别的节点还是活着的),所以分布式系统中P是必须要有的。比如数据库主从架构,主从两个节点之间需要数据同步,主挂了,…

Mybatis中limit用法补充

limit a,b a是从第a1条数据开始,b是指读取几条数据 例如:select * from table limit 0,10 这句sql语句是说从表中获取第1条开始的10条记录 前端将page:页码    pageSize:每页多少条    这两个参数,传到后台。    通过这两个参数&am…

火焰图:链路追踪分析的可视化利器

什么是火焰图? 火焰图用于可视化分布式链路追踪,通过使用持续时间和不同颜色的水平条形来表示请求执行路径中的每个服务调用。分布式跟踪的火焰图包括错误、延迟数据等详情,帮助开发人员识别和解决应用程序中的瓶颈问题。 链路追踪与 Span …

易货:一种古老而有效的商业模式

在当今的商业世界中,我们常常听到关于电子商务、互联网和社交媒体等新技术的讨论。然而,尽管这些新技术为我们的日常生活带来了许多便利,但它们并没有完全取代传统的商业模式。其中,易货模式是一种古老而有效的商业模式&#xff0…

AI绘画工具汇总

目前市面上的AI绘画工具十分繁杂,以下工具可供参考: 1. Midjourney 添加图片注释,不超过 140 字(可选) Midjourney:最主流的AI绘图工具之一,出图效果好,简单学习就可上手。需要在di…

Golang获取月份的第一天和最后一天

package mainimport ("fmt""strconv""strings""time" )func main() {month : "2023-11"result : GetMonthStartAndEnd(month)fmt.Println(result["start"] " - " result["end"]) }// 获取月…

Stable Diffusion WebUI使用AnimateDiff插件生成动画

AnimateDiff 可以针对各个模型生成的图片,一键生成对应的动图。 配置要求 GPU显存建议12G以上,在xformers或者sdp优化下显存要求至少6G以上。 要开启sdp优化,在启动参数加上--sdp-no-mem-attention 实际的显存使用量取决于图像大小&#…

StatSVN统计svn项目中每人代码提交量

一.JDK配置 StatSVN是java语言开发的,要运行必须先安装jdk并配置环境变量。 1.jdk下载地址https://www.oracle.com/ 2.jdk环境变量配置,路径为jdk安装位置 二.下载StatSVN 1.下载地址 http://sourceforge.net/projects/statsvn/ 2.解压到本地目录&a…

【Oracle 客户端连接数据库过程解析】

文章目录 一、开篇二、Oracle客户端简介三、连接过程解析 一、开篇 Oracle数据库以其卓越的性能和稳定性赢得了众多企业的信赖。作为开发者或数据库管理员,理解Oracle客户端如何与数据库建立连接,是确保系统正常运行的关键。 二、Oracle客户端简介 首…

Facebook游戏出海营销指南

当谈到Facebook游戏出海营销时,有一些关键的策略和指南可以帮助你在国际市场上取得成功。下面是一个详细的指南,帮助你了解如何有效地推广和推出你的游戏。 1、了解目标市场 在开始出海营销之前,你需要对你的目标市场进行深入的研究。了解该…

【功能栏】基于session的模拟短信注册功能

框架: spring boot mybatis-plus 目录 1.创建user表 ​编辑2. mybatis-plus插件 3.导入相关依赖 4.配置文件 5.前端代码 register.html style.css 6.后端代码 entity层 mapper层 sevice层 业务层接口 业务层实现类 controller层 7.调试 1. 未输…

【python】Django——连接mysql数据库

笔记为自我总结整理的学习笔记,若有错误欢迎指出哟~ 【Django专栏】 Django——django简介、django安装、创建项目、快速上手 Django——templates模板、静态文件、django模板语法、请求和响应 Django——连接mysql数据库 Django——连接mysql数据库 连接MySQL数据库…

免费开源客服机器人tiledesk 实现一个查询天气机器人

第一步,槽位收集: 第二步:天气api接口调用: 效果展示:

基于电力需求侧能效管理平台的建设及应用

贾丽丽 安科瑞电气股份有限公司 上海嘉定 201801 摘要:电力是国民经济和居民生活的命脉,为贯彻落实国家对于节能减排工作的总体部署,深入推进电力需求侧管理工作、本文从电力需求侧能效管理平台所要实现的功能与应用信息技术两个方面&#x…

windows上安装make

windows上安装make 1.使用包管理工具Cygwin:(官网:https://www.cygwin.com/) 来进行安装,根据上述网址找到cygwin下载链接(准确地址为:https://www.cygwin.com/setup-x86_64.exe) 2.在安装程序…

开发程序员的宝藏工具/网站

博主在这里收录各式各样的工具/网站,都是一些能够帮助开发、提高效率的好东西 博主会不断更新,更加欢迎大家把自己觉得好用的分享在评论区 记得收藏起来,免得以后找不到了 1.文本对比 在线文本差异对比,文本比对、文本比较工具 能够将两边的…

RNA模型可以帮助发现疾病机制和候选药物

今天为大家介绍的是来自Tehmina Masud, Amit Deshwar, Shreshth Gandhi, Brendan J. Frey团队的一篇论文。精确地对RNA生物学进行建模和预测一直是一个长期存在的挑战,对于变异解释和定制治疗的制定具有重要的临床意义。作者提出了一个RNA生物学的基础模型&#xff…

传统的纸质设备保养方式的痛点以及解决方案

传统的纸质设备保养方式,在现代企业管理中面临多种痛点,这些问题可能影响企业的运营效率和设备维护的效果。以下是一些主要痛点: 信息更新缓慢和访问不便:纸质记录的更新通常需要手动完成,这不仅耗时,而且在…

echarts:graph图表拖拽节点

需求:实现一个可视化编辑器,用户可以添加节点,并对节点进行拖拽编辑等 实现期间碰到很多问题,特意记录下来,留待将来碰到这些问题的同学,省去些解决问题的时间 问题1:节点的data如下&#xff0…

excel中vlookup用法

excel中vlookup用法 用法示例 参数说明 参数1:E1用于匹配的字段 参数2:E1:F4,匹配表格范围 参数3:要取的字段属于匹配表格范围的第几列 数据4:精确匹配