互斥信号量和二值信号量的区别

2023-05-16

详解互斥信号量的概念和运行

https://blog.csdn.net/weichushun/article/details/122744773

互斥信号量的主要作用是对资源实现互斥访问,使用二值信号量也可以实现互斥访问的功能,不过互斥信号量与二值信号量有区别。

===========================

理解互斥量和信号量

互斥量(Mutex)

互斥量表现互斥现象的数据结构,也被当作二元信号灯。

一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源

死锁主要发生在有多个依赖锁存在时, 会在一个线程试图以与另一个线程相反顺序锁住互斥量时发生. 如何避免死锁是使用互斥量应该格外注意的东西。

  总体来讲, 有几个不成文的基本原则:

  对共享资源操作前一定要获得锁。

  完成操作以后一定要释放锁。

  尽量短时间地占用锁。

  如果有多锁, 如获得顺序是ABC连环扣, 释放顺序也应该是ABC。

  线程错误返回时应该释放它所获得的锁。

Mutex可以被抽象为四个操作:

- 创建 Create

- 加锁 Lock

- 解锁 Unlock

- 销毁 Destroy

信号量

信号量(Semaphore),有时被称为信号灯,是在多线程环境下使用的一种设施, 它负责协调各个线程, 以保证它们能够正确、合理的使用公共资源。

Semaphore可以被抽象为五个操作:

- 创建 Create

- 等待 Wait:

-释放 Post

-试图等待 TryWait

-销毁 Destroy

https://blog.csdn.net/rommi/article/details/6015143?spm=1001.2101.3001.6650.1&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-6015143-blog-122744773.pc_relevant_recovery_v2&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1-6015143-blog-122744773.pc_relevant_recovery_v2&utm_relevant_index=2

===========================

关于互斥信号量和二值信号量的区别

二值信号量:

用于任务同步中断同步,也可以实现互斥访问,但不具有优先级继承

通过二值信号量实现互斥访问:

1.创建3个任务task1,task2,task3,优先级分别是 3,2,1(高--->低).

2. 开始task3首先获得二值信号量资源,但task1优先级比task3高抢占了task3的cpu使用权

3. task1也需要获取二值信号量,所以task1就会挂起,等待task3释放二值信号量。

4. 由于 task2已经处于就绪态,并且优先级比task3高,task2抢占了task3的cpu使用权,此时优先级翻转就发生了,task1(高优先任务)需要等待task2(低优先任务)运行完后才能运行,task3任务继续执行并释二值信号量资源,task1才能获取到二值信号量,从而可以继续执行

互斥信号量:

互斥信号量简单说是具有优先级继承二值信号量,用于进程中的互斥,不可用于中断中(1:具有优先级继承机制,2:中断服务函数不能因为等待互斥信号量而阻塞

互斥信号量优先级继承机制:

当一个低优先级的任务正在使用这个互斥信号量时,高优先的任务在等待这个互斥信号量的时候,高优先级的任务会将低优先级的任务的优先级提到和自己同一个水平(目的:避免优先级翻转,从而来避免位于低优先和高优先的任务抢占cpu时间运行,而导致次优先级任务先于高优先级的任务运行,引起优先级翻转。

注:包含了2方面的内容:??

  1. 即使是最低优先级的task, 一旦对目标资源已经成功加锁,则即使是高优先级的task,也无法抢占当然,系统级别的中断任务、或其他他别任务,还是可以抢占的。

  1. 优先级翻转,发生于都处在等待该资源的、多个的、任务之间

优先级继承也只是尽可能的降低优先级翻转的发生,软件设计的时候需避免优先级翻转的问题发生

通过互斥信号量实现互斥访问:

与上一个说明相比,这是容易理解的说明:

1.一开始task3开始运行,先获取到互斥锁

2. task1开始运行尝试去获取互斥锁失败被阻塞等待task3执行完,但是此时提升task3的优先级,让其优先级跟自己一样

3.task3运行过程中,task2被触发,由于其优先级低于task3(第2步被提升过),task2等待运行

4.继续运行task3,运行完后释放互斥锁

5.task1继续运行

6.task1执行完,执行task2所以过程跟前面的虽然一样,但是互斥锁多做了一个步骤就是将task3的优先级提升到task1的级别,防止task2中途出来搅局浪费大量时间

链接:https://www.jianshu.com/p/6aba818784d8

FreeRTOS互斥信号量与二值信号量使用时的区别

1.互斥信号量

互斥信号量的申请与释放是要在同一个任务中进行的,不能在一个任务中申请而在另一个任务中释放。

互斥信号量主要解决的是,我在用的时候,别人都不能用。举个例子,我在像一段内存中写数据的时候,不允许别人去写和读的,这时候就需要互斥信号量,写之前获取信号量,写完之后再释放互斥信号量。

2.二值信号量

二值信号量允许在一个任务中申请,在另外一个任务中释放

二值信号量主要解决的是任务同步的问题。举个例子,一个任务用于处理UART的数据,UART中断中接受数据,当任务处理数据时就获取信号量,中断接受到数据就释放信号量,这样就可以使得中断与任务接受和处理协同处理。

————————————————

版权声明:本文为CSDN博主「MC_J」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://blog.csdn.net/qq_37868856/article/details/105770937

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

互斥信号量和二值信号量的区别 的相关文章

  • MathJax 3.0 配置方法,上手配置

    说明 网上很多MathJax 的配置方法适用于旧版本 新版的MathJax做了一些改进 配置方式也做了调整 最简单的方案 方便起见 最简单的方案如下 span class token tag span class token tag spa
  • VsCode+LaTexWorkshop外置PDF预览配置(2021.3.3)

    随着插件版本的升级有些配置命令发生了改变 xff0c 这里只是做个简单记录 xff0c 写的比较粗糙 后面有闲工夫再来做做美工 VsCode一侧配置 34 latex workshop view pdf viewer 34 34 exter
  • MATLAB批量为png透明(抠图)图片替换添加背景

    MATLAB批量为png透明 抠图 图片替换添加背景 说明 最近有个小需求 需要抠图后将抠图的背景替换为指定图片 如果一张一张做 图片多了实在是不好用 前提 准备好背景图片 一张准备好目标图片 很多张可以利用powertoys将目标图片统一
  • PilotPi:树莓派运行PX4配置方法

    直接看最后 即可 前言 PX4开源飞控固件支持很多款硬件 包括pixhawk cuav 和 cube等 在1 12版本中px4官方开始实验性的支持树莓派直接运行 这样我们就可以在树莓派上直接运行飞控程序 考虑到树莓派处理器的性能 那么就算可
  • PX4 1.12版本后启用lpe导致飞控启动失败的问题的解决办法

    时间 20220531 问题 在PX4 升级到1 12后使用local position estimator也就是LPE后会导致飞控启动失败 从SD卡的log中可以看到是硬件错误 解决办法 将文件 PX4Firmware根目录中的文件 pl
  • 多旋翼/四旋翼半物理(硬件在环HIL)仿真

    半物理仿真平台基本框架如图所示 多旋翼HIL平台结构图 其中 xff0c 最重要的也就是中间的部分 xff0c 一个是多旋翼模型 xff0c 另一个是传感器部分实现 硬件平台目前使用的是NI的myRIO xff08 临时的 xff09 xf
  • 如何编写VeriStand custom device/custom FPGA Target以及基本原理

    在做HIL开发的时候用到了FPGA xff0c 对于Labview中可以很方便的使用FPGA xff0c 但是在用VeriStand 做模型仿真的时候 xff0c 调用FPGA就没呢么方便了 感觉就是功能还没有完善 如果想要在Labview
  • 提高github下载速度的方法【100%有效】可达到2MB/s

    在国内从github上面下载代码的速度峰值通常都是20kB s 这种速度对于那些小项目还好 xff0c 而对于大一些的并且带有很多子模块的项目来讲就跟耽误时间 虽然有很多提速的方法 xff0c 但是实际用起来并不稳定 这里提供一种新的方法
  • 如何理解选主元的Doolittle分解法

    书中讲解不是很详细 xff0c 理解之后总结一下 首先说一下 xff0c 之所以要理解选主元的Doolittle分解是因为书中对于该分解过程的讲解比较违和 本文的目的是为了说明 xff1a 选主元的Doolittle分解法分解得到的LU矩阵
  • Latex中插入eps图片不显示,显示空白

    Latex中插入eps图片变异后 xff0c 生成的pdf文件中 xff0c 图片为空白 在文章开头 documentclas 后面添加如下代码即可 usepackage graphicx usepackage epstopdf 或者 us
  • C/C++ 信号量 CreateSemaphore 用法

    HANDLE CreateSemaphore LPSECURITY ATTRIBUTES lpSemaphoreAttributes SD LONG lInitialCount initial count LONG lMaximumCoun
  • 单片机寄存器的位操作

    1 连续多位需要操作 假如需要将B16的D8 D10位改为0001 xff0c 但是更改D8 D10位时又不能改变其它位状态 xff1a 所以需要先将D8 D10位 清0 xff0c 再改为0001 PORTB gt PCR 16 amp
  • DockerFile编写、加载、镜像保存、上传阿里云镜像

    DockerFile用来构建docker镜像文件 指令 说明 FROM 指定基础镜像 MAINTAINER 镜像是谁写的 xff0c 姓名 43 邮箱 RUN 镜像构建的时候需要运行的命令 ADD 将本地文件添加到容器中 xff0c tar
  • 手把手教你写一个属于自己的库

    写在前面 xff1a 本文章使用devc 43 43 xff0c 若用VC的别进来 xff01 如果你不知道怎么写库 xff0c 请参考我这篇文章 xff1a 手把手教你建立c 43 43 个人库 在新建好库文件之后 xff0c 我们就可以
  • warning: libopencv_imgcodecs.so.3.2, needed by /...warning: libpng12.so.0, needed by /usr/local/lib/

    warning libopencv imgcodecs so 3 2 needed by opt ros melodic lib libcv bridge so may conflict with libopencv imgcodecs s
  • /usr/bin/ld: warning: libopencv_imgcodecs.so.3.2, needed by /usr/lib/x86_64-linux-gnu/libopencv_high

    出现一个警告信息 xff0c 暂时不管 usr bin ld warning libopencv imgcodecs so 3 2 needed by usr lib x86 64 linux gnu libopencv highgui s
  • 灰度图像二值化-----c++实现

    前天闲着没事干 xff0c 就写了写BMP图像处理 xff0c 感觉大家还比较感兴趣 所以现在没事 xff0c 继续更新 这次简单的写了灰度图像二值化 这是什么概念呢 xff1f 图像的二值化的基本原理 图像的二值化处理就是将图像上的点的灰
  • 3D打印情况记录(1)

    打印情况记录 xff08 1 xff09 打印参数打印结果 打印参数 切片软件MakerBot Print xff0c 温度195 xff0c 材料白色pla xff0c 外壳打印速度40mm s xff0c 内衬打印速度稀疏30mm s
  • 【在VScode中使用终端命令编译运行c++程序】

    在VScode下的powershell下使用命令行编译运行c 43 43 文件 xff1a 首先 xff0c 进入文件所在的路径地址 xff1a 编译生成 exe可执行文件的不同方式 xff1a 不指定生成可执行文件的名称 xff1a 执行

随机推荐

  • 连接字符串strcat()函数

    strcat 函数的原型 xff1a span class hljs preprocessor include lt string h gt span span class hljs keyword char span span class
  • makefile '@' '$' '$$' '-' '-n ' 使用小结

    编译代码时 xff0c 会进程接触makefile xff0c 会涉及到一些符号 xff0c 由于不明白有些意思经常出现问题 xff0c 在此归纳一下 39 64 39 符号的使用 通常makefile会将其执行的命令行在执行前输出到屏幕上
  • 【STM32】RTC实时时钟,步骤超细详解,一文看懂RTC

    什么是RTC RTC Real Time Clock xff1a 实时时钟 RTC是个独立的定时器 RTC模块拥有一个连续计数的计数器 xff0c 在相应的软件配置下 xff0c 可以提供时钟日历的功能 修改计数器的值可以重新设置当前时间和
  • FreeRTOS学习(一)

    前言 最近正在学习和FreeRTOS相关的知识 xff0c 在此记录一下 xff0c 学习资料来自正点原子 在学习之前 xff0c 我也有一个和很多初学者共同的疑惑 Why RTOS xff1f 在探究这个问题之前 xff0c 我想先回顾一
  • stm32CUBEIDE 生成的串口初始化代码详解

    static void MX USART1 UART Init void huart1 Instance 61 USART1 huart1 Init BaudRate 61 115200 huart1 Init WordLength 61
  • Install Python 3 on Ubuntu 18.04 or 20.04

    Install Python 3 on Ubuntu 18 04 or 20 04 Step1 Check your version of PythonStep 2 Install Supporting SoftwareStep 3 Dow
  • Python 报错:Command "python setup.py egg_info" failed with error code 1

    最近做一个项目 xff0c 需要搭建很多不同的python环境 xff0c 于是我就用pip install装了很多包 xff0c 但是装包的时候我遇到了很多次这个报错 xff0c 比如这一次我在安装imgaug的时候也提示了这个错误 如图
  • FreeRTOS 常用的几个函数

    1 xff09 vTaskSuspend TaskHandle t Task ID 挂起指定任务 被挂起的任务绝不会得到CPU的使用权 xff0c 不管该任务具有什么优先 级 使用实例 static TaskHandle t LED Tas
  • FreeRTOS 任务设计注意事项

    1 FreeRTOS中程序运行的上下文包括 xff1a 中断服务函数普通任务空闲任务 1 xff09 中断服务函数是一种需要特别注意的上下文环境 xff0c 它运行在非任务的执行环境下 xff08 一般为芯片的一种特殊运行模式 xff08
  • 2022,程序员应该如何找工作

    最近找工作面了不少公司 xff0c 也有不少感悟和心得 xff0c 今天在这里分享给大家 1 想清楚自己为什么离职 每个人离职都有自己的理由 xff0c 这里列举了一些离职理由 钱给的不够干的不开心没有发展前途加班太严重回老家发展领导不好不
  • 我的四轴飞行器经验总结(一)

    从我看到了TED的演讲和不断冒出来大疆的无人机产品新闻开始 xff0c 我开始爱上了做四轴飞行器 xff0c 有的人可能只当做是一个电子产品制作或者DIY什么的 xff0c 可是我觉的我对四轴飞行器有着更加深的感情 xff0c 就连我的桌面
  • 环境变量设置后不生效

    不需要重启系统 xff0c 只需要重启VS
  • mac os上编译vlc视频库的踩坑之旅

    mac os上编译vlc视频库的踩坑之旅 mac os上编译vlc视频库的踩坑之旅 开始编译VLC视频库 一前期准备工作二参照官方编译文档安装软件三开始编译vlc四踩一些坑五总结 新项目开始目涉及媒体播放 xff0c 在android上多媒
  • 【JAVA】Eclipse保存时出现“Save could not be completed”问题

    问题 xff1a Save could not be completed 原因 xff1a eclipse的默认编译语言是 34 ISO 8859 1 34 xff0c 这个语言不支持中文 xff0c 所以如果编辑的程序含有中文而且编译语言
  •  MX-Linux:在distrowatch上的排名,为什么能够做到第一?

    个人观点 xff1a MX Linux 很好 MX Linux 桌面操作系统的成功 xff0c 主要有以下这几个因素 xff1a A 技术因素 xff1a 1 关键因素 xff1a MX snapshots工具 xff1b 2 次要因素 x
  • Qt 出现“程序异常结束”问题可能的解决思路

    第三方库的编译有问题 请注意 xff0c 出现此种问题绝不止这一个原因 xff0c 还包括其它很多原因 xff0c 这些原因可能千奇百怪 xff0c 需要你的开发经验去积累去发掘 在这里 xff0c 根据我自己的经验 xff0c 总结几种可
  • Qt 中如何在主窗口中添加子窗口

    方法 原理其实简单 和在窗口上动态 代码的形式 添加控件的方法一样 但需要设置一下子窗口的属性 在子窗口构造函数中添加代码 setWindowFlags Qt FramelessWindowHint 作用 隐藏子窗口的标题栏和边框 如果不隐
  • Qt5 自定义字体修改: 字体、大小以及颜色(部分要点已实测)

    Qt设置字体类型及添加字体文件 Qt 添加字体文件 1 设置支持的字体 QFont font font setFamily 34 填写字体名称 34 2 通过字体文件来设置字体 字体的名称可以是自带的 xff0c 也可以是外部的 xff0c
  • Qt QTableWidget 表格自适应 高度和宽度

    1 在MainWindow中设置 对被嵌入的子窗口进行设置 xff0c 去除子窗口的一些影响到嵌入的部件 pTable gt setWindowFlags Qt CustomizeWindowHint Qt FramelessWindowH
  • 互斥信号量和二值信号量的区别

    详解互斥信号量的概念和运行 https blog csdn net weichushun article details 122744773 互斥信号量的主要作用是对资源实现互斥访问 xff0c 使用二值信号量也可以实现互斥访问的功能 xf