互斥量保护资源

一、概念
 

在多数情况下,互斥型信号量和二值型信号量非常相似,但是从功能上二值型信号量用于同步,
而互斥型信号量用于资源保护。
互斥型信号量和二值型信号量还有一个最大的区别,互斥型信号量可以有效解决优先级反转现
象。
优先级反转:
系统中有 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);
  }

}

运行结果:

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

在 Rocky 中使用 FreeRDP 远程连接 Windows 机器

前言: 远程控制已成为 IT 人员和企业用户在处理日常任务时不可或缺的工具。无论是进行系统管理、支持远程工作,还是协助解决技术问题,一个可靠且高效的远程桌面工具都是业务连续性的关键。开始我个人使用了todesk(也曾鲜想过向日…

瑞吉外卖Day04

1.文件的上传下载 Value("${reggie.path}")private String basePath;/*** 文件上传** param file* return*/PostMapping("/upload")public R<String> upload(MultipartFile file) {log.info("文件上传");//原始文件名String originalFilen…

ssm823基于ssm的心理预约咨询管理系统的设计与实现+vue

ssm823基于ssm的心理预约咨询管理系统的设计与实现vue 交流学习&#xff1a; 更多项目&#xff1a; 全网最全的Java成品项目列表 https://docs.qq.com/doc/DUXdsVlhIdVlsemdX 演示 项目功能演示&#xff1a; ————————————————

C语言每日一题(29)合并两个有序链表

力扣网 21合并两个有序链表 题目描述 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 思路分析 最基本的一种思路就是&#xff0c;遍历两个链表&#xff0c;将对应结点的值进行比较&#xff0c;题目要求是要升序排…

springboot单体项目部署

配置类 检查跨域配置类 检查黑白名单是否有问题&#xff0c;是否需要更改 配置文件 检查端口 查看端口是否为需要搭建的端口 检查数据源 查看数据库是否为线上数据库 配置页面 注意&#xff1a;如果是单体项目的话&#xff0c;前端页面是和后端整合在一起的&#xff0…

测试用例的书写方式以及测试模板大全

一个优秀的测试用例&#xff0c;应该包含以下信息&#xff1a; 1 &#xff09; 软件或项目的名称 2 &#xff09; 软件或项目的版本&#xff08;内部版本号&#xff09; 3 &#xff09; 功能模块名 4 &#xff09; 测试用例的简单描述&#xff0c;即该用例执行的目的或方法…

如何创建标准操作规程(SOP)[+模板]

创建、分发和管理流程文档和逐步说明的能力是确定企业成功的关键因素。许多组织依赖标准操作规程&#xff08;SOP&#xff09;作为基本形式的文档&#xff0c;指导他们的工作流程操作。 然而&#xff0c;SOP不仅仅是操作路线图&#xff1b;它们就像高性能车辆中的先进GPS系统一…

LinkedHashMap源码分析

类结构图 从类图结构可以看出&#xff0c;LinkedHashMap继承自HashMap&#xff0c;里面很多实现都是HashMap的&#xff0c;这篇文章主要写出LinkedHashMap自实现的那部分 Entry LinkedHashMap的每个元素项都是一个Entry类对象&#xff0c;该类继承自HashMap.Node类 static c…

【missing-semester】The shell

文章目录 shell 是什么shell 怎么用执行基本程序 Shell中的路径重定向输入输出管道piperoot用户的使用课后练习参考资料 我的操作环境&#xff1a;Windows11下的WSL2(Ubuntu20.04)&#xff0c;之后的所有操作都是基于这个前提的 shell 是什么 命令行操作语言&#xff0c;文本界…

pycharm安装库失败

项目场景 pycharm安装第三方库 问题描述 python 安装第三方库总是安装失败 原因分析&#xff1a; 提示&#xff1a;这里填写问题的分析&#xff1a; 1.网络 2.网墙 解决方案&#xff1a; 加个镜像 –trusted-host mirrors.aliyun.com

【EI会议征稿】第四届信息化经济发展与管理国际学术会议(IEDM 2024)

第四届信息化经济发展与管理国际学术会议&#xff08;IEDM 2024&#xff09; 2024 4th International Conference on Informatization Economic Development and Management 第四届信息化经济发展与管理国际学术会议&#xff08;IEDM 2024&#xff09;将于2024年2月23-25日在…

C++ opencv基本用法【学习笔记(九)】

这篇博客为修改过后的转载&#xff0c;因为没有转载链接&#xff0c;所以选了原创 文章目录 一、vs code 结合Cmake debug1.1 配置tasks.json1.2 配置launch.json 二、图片、视频、摄像头读取显示2.1 读取图片并显示2.2 读取视频文件并显示2.3 读取摄像头并写入文件 三、图片基…

现货黄金职业交易员怎么使用技术分析?

职业的交易员每天要处理很多不同的信息&#xff0c;其中只一部分是涉及技术指标。在这一部分处理技术分析的时间里&#xff0c;只能再分出少之又少的时间给技术指标。那职业交易员会利用做技术指标做什么呢&#xff1f;下面我们就来讨论一下。 识别行情。技术指标的主要作用就是…

TikTok女性创作者:媒体世界的新领袖

在数字时代&#xff0c;社交媒体已成为媒体和娱乐产业的关键组成部分&#xff0c;而TikTok作为最受欢迎的短视频分享平台之一&#xff0c;为女性创作者提供了一个独特的机会来在媒体世界中崭露头角。 这个平台不仅为女性创作者提供了一个创作和分享自己的声音、观点和创意的空…

(三)什么是Vite——Vite 主体流程(运行npm run dev后发生了什么?)

什么是vite系列目录: &#xff08;一&#xff09;什么是Vite——vite介绍与使用-CSDN博客 &#xff08;二&#xff09;什么是Vite——Vite 和 Webpack 区别&#xff08;冷启动&#xff09;-CSDN博客 &#xff08;三&#xff09;什么是Vite——Vite 主体流程(运行npm run dev…

江西产业链现代化1269行动计划引领新能源建设与职业教育教学改革的深度融合

江西产业链现代化1269行动计划引领新能源建设与职业教育教学改革的深度融合 在全球能源转型的时代背景下&#xff0c;江西省积极应对挑战&#xff0c;提出了产业链现代化1269行动计划。这一计划不仅着眼于推动新能源建设&#xff0c;还将新能源建设与职业教育教学改革紧密结合…

Axure9 基本操作(二)

1. 文本框、文本域 文本框&#xff1a;快速实现提示文字与不同类型文字显示的效果。 2. 下拉列表、列表框 下拉列表&#xff1a;快速实现下拉框及默认显示项的效果。 3. 复选框、单选按钮 4.

零成本体验美国云服务器,更方便的体验和选择

在当今数字化时代&#xff0c;云计算已经成为了企业和个人的首选。而美国云服务器免费试用&#xff0c;则为广大用户提供了一个零风险尝试的机会。作为一种高效、灵活、稳定的解决方案&#xff0c;美国云服务器可以为您的业务保驾护航。 什么是美国云服务器&#xff1f; 美国云…

掌握AI图像篡改检测工具,轻松识别图片造假

文章目录 一、前言1.1 背景与危害1.2会议探讨1.3 技术先行 二、亮点技术1&#xff1a;AI图像篡改检测技术2.1 传统方法Python实现步骤2.2 合合信息——PS纂改检测体验 三、亮点技术2&#xff1a;生成式图像鉴别3.1 生成式图像安全问题3.2 传统方法Python实现步骤3.2 合合信息—…

《Linux从练气到飞升》No.27 Linux中的线程互斥

&#x1f57a;作者&#xff1a; 主页 我的专栏C语言从0到1探秘C数据结构从0到1探秘Linux菜鸟刷题集 &#x1f618;欢迎关注&#xff1a;&#x1f44d;点赞&#x1f64c;收藏✍️留言 &#x1f3c7;码字不易&#xff0c;你的&#x1f44d;点赞&#x1f64c;收藏❤️关注对我真的…