互斥信号量和二进制信号量的区别

二值信号量(Binary Semaphore)和互斥量(Mutex)的解析 二值信号量(Binary Semaphore):二值信号量是一种特殊的信号量,其状态只有两种:可用(通常表示为1)和不可用(通常表示为0)。它主要用于任务间的同步和简单的互斥访问。二值信号量可以看作是长度为1的队列,队列要么为空(信号量为0),要么为满(信号量为1)。互斥量(Mutex):互斥量是一种用于确保在任何时刻只有一个线程能够访问共享资源的机制。互斥量也是二进制的,但相比二值信号量,它增加了“持有权”的概念,即只有当前持有互斥量的任务才能释放它。这使得互斥量在保护共享资源时更加严格和可靠。 阅读详情

互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。

 

       二进制信号量,一个任务申请成功后,可以由另一个任务释放。

 

二进制信号量实现任务互斥:

     打印机资源只有一个,abc三个任务共享,当a取得使用权后,为了防止其他任务错误地释放了信号量(),必须将打印机房的门关起来(进入临界段),用完后,释放信号量,再把门打开(出临界段),其他任务再进去打印。(而互斥型信号量由于必须由取得信号量的那个任务释放,故不会出现其他任务错误地释放了信号量的情况出现,故不需要有临界段。互斥型信号量是二进制信号量的子集。)

 

二进制信号量实现任务同步:

     a任务一直等待信号量,b任务定时释放信号量,完成同步功能

 

理解互斥量和信号量 作者: JuKevin

互斥量(Mutex)

       互斥量表现互斥现象的数据结构,也被当作二元信号灯。一个互斥基本上是一个多任务敏感的二元信号,它能用作同步多任务的行为,它常用作保护从中断来的临界段代码并且在共享同步使用的资源。

       Mutex本质上说就是一把锁,提供对资源的独占访问,所以Mutex主要的作用是用于互斥。Mutex对象的值,只有0和1两个值。这两个值也分别代表了Mutex的两种状态。值为0, 表示锁定状态,当前对象被锁定,用户进程/线程如果试图Lock临界资源,则进入排队等待;值为1,表示空闲状态,当前对象为空闲,用户进程/线程可以Lock临界资源,之后Mutex值减1变为0。Mutex可以被抽象为四个操作: - 创建 Create

 

- 加锁 Lock

 

- 解锁 Unlock

 

- 销毁 Destroy

 

Mutex被创建时可以有初始值,表示Mutex被创建后,是锁定状态还是空闲状态。在同一个线程中,为了防止死锁,系统不允许连续两次对Mutex加锁(系统一般会在第二次调用立刻返回)。也就是说,加锁和解锁这两个对应的操作,需要在同一个线程中完成。

 

不同操作系统中提供的Mutex函数: 动作/系统

Win32

Linyx

Solaris

 

创建

CreateMutex

pthread_mutex_init

mutex_init

 

加锁

WaitForSingleObject

pthread_mutex_lock

mutex_lock

 

解锁

ReleaseMutex

pthread_mutex_unlock

mutex_unlock

 

销毁

CloseHandle

pthread_mutex_destroy

mutex_destroy

 

 

信号量

 

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

 

信号量可以分为几类:

 

二进制信号量(binary semaphore):

       只允许信号量取0或1值,其同时只能被一个线程获取。

 

整型信号量(integer semaphore)

       信号量取值是整数,它可以被多个线程同时获得,直到信号量的值变为0。

 

记录型信号量(record semaphore)

       每个信号量s除一个整数值value(计数)外,还有一个等待队列List,其中是阻塞在该信号量的各个线程的标识。当信号量被释放一个,值被加一后,系统自动从等待队列中唤醒一个等待中的线程,让其获得信号量,同时信号量再减一。

 

       信号量通过一个计数器控制对共享资源的访问,信号量的值是一个非负整数,所有通过它的线程都会将该整数减一。如果计数器大于0,则访问被允许,计数器减1;如果为0,则访问被禁止,所有试图通过它的线程都将处于等待状态。

计数器计算的结果是允许访问共享资源的通行证。因此,为了访问共享资源,线程必须从信号量得到通行证, 如果该信号量的计数大于0,则此线程获得一个通行证,这将导致信号量的计数递减,否则,此线程将阻塞直到获得一个通行证为止。当此线程不再需要访问共享资源时,它释放该通行证,这导致信号量的计数递增,如果另一个线程等待通行证,则那个线程将在那时获得通行证。

 

 

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

- 创建 Create

 

- 等待 Wait:

 

线程等待信号量,如果值大于0,则获得,值减一;如果只等于0,则一直线程进入睡眠状态,知道信号量值大于0或者超时。

 

-释放 Post

 

执行释放信号量,则值加一;如果此时有正在等待的线程,则唤醒该线程。

 

-试图等待 TryWait

 

如果调用TryWait,线程并不真正的去获得信号量,还是检查信号量是否能够被获得,如果信号量值大于0,则TryWait返回成功;否则返回失败。

 

-销毁 Destroy

 

信号量,是可以用来保护两个或多个关键代码段,这些关键代码段不能并发调用。在进入一个关键代码段之前,线程必须获取一个信号量。如果关键代码段中没有任何线程,那么线程会立即进入该框图中的那个部分。一旦该关键代码段完成了,那么该线程必须释放信号量。其它想进入该关键代码段的线程必须等待直到第一个线程释放信号量。为了完成这个过程,需要创建一个信号量,然后将Acquire Semaphore VI以及Release Semaphore VI分别放置在每个关键代码段的首末端。确认这些信号量VI引用的是初始创建的信号量。 动作/系统

Win32

POSIX

 

创建

CreateSemaphore

sem_init

 

等待

WaitForSingleObject

sem _wait

 

释放

ReleaseMutex

sem _post

 

试图等待

WaitForSingleObject

sem _trywait

 

销毁

CloseHandle

sem_destroy

 

 

 

互斥量和信号量的区别

 

1. 互斥量用于线程的互斥,信号量用于线程的同步。 ——

       这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。

2.互斥量无法保证线程对资源的有序访问,信号量可以。

 

互斥

       是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。(cute:好比一个别墅,同时只能卖个一个人。这个人可以在门上加上任意多的锁(申请多次),但是锁必须由这个人打开,因为只有他掌握着钥匙。如果别的人真的想控制这个别墅的大门,则它首先应该把这个别墅买下来(别墅的主人放弃所有权))

 

同步

       是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源 (cute:相当于图书馆阅览室的书卡,你申请的时候-1,另一个人还的时候则可以+1,我们都可以修改书卡的当前可用数目,这个权利是不独属于任何人的。)

 

3. 互斥量值只能为0/1,信号量值可以为非负整数。

 

       也就是说,一个互斥量只能用于一个资源的互斥访问,它不能实现多个资源的多线程互斥问题。信号量可以实现多个同类资源的多线程互斥和同步。当信号量为单值信号量是,也可以完成一个资源的互斥访问。

 

4. 互斥量的加锁和解锁必须由同一线程分别对应使用,信号量可以由一个线程释放,另一个线程得到

 

====

http://topic.youkuaiyun.com/u/20090317/02/51AAB1DC-4DF4-4B6B-A0CB-A46D2602074F.html

FreeRTOS 互斥信号量和二值信号量对比 互斥信号量 1.有优先级继承。 2.尽量不要在中断中调用 3.xSemaphoreCreateMutex创建后,可以直接take使用。 二值信号量 1.无优先级继承。 2.允许在中断中调用。 3.可以当做标志位来使用。 4.xSemaphoreCreateBinary创建后,必须得先give一下才能被take。 这么说其实很笼统,直接代码测试。 这里使用的是互斥信号量。 1.创建两个测试任务,app_mqtt_get_properties_handle_task和app_mqtt_se 阅读详情

相关推荐

FreeRTOS信号量实战:二进制与互斥信号量的核心区别与应用

在嵌入式实时操作系统(RTOS)中,任务间的同步与资源保护是并发编程的基础。信号量作为一种核心的同步原语,通过计数机制协调多任务对共享资源的访问。其原理在于提供了一种任务间通信与互斥的标准化方法,有效避免了数据竞争和死锁。从技术价值看,信号量是构建稳定、可预测实时系统的关键,尤其在资源受限的嵌入式环境中。常见的应用场景包括中断服务程序与任务同步、保护全局变量或硬件外设等。本文聚焦于FreeRTOS中的两种核心信号量:二进制信号量与互斥信号量。二进制信号量主要用于事件通知和任务同步,例如在中断与任务同步场景中

weixin_30907935的博客 373

别再傻傻分不清了!FreeRTOS里二值信号量和互斥量到底该用哪个?附实战代码避坑

本文深入解析FreeRTOS中二值信号量与互斥量的核心区别与应用场景,帮助开发者避免常见同步陷阱。通过实战代码示例,详细展示何时使用二值信号量进行任务同步,何时选择互斥量保护共享资源,并针对优先级反转、死锁等问题提供解决方案,提升嵌入式系统稳定性与性能。

weixin_42527160的博客 358

海思Hi3516CV610开发实战:在Ubuntu 22.04上从零构建嵌入式Linux开发环境

本文详细介绍了在Ubuntu 22.04上为海思Hi3516CV610开发板搭建嵌入式Linux开发环境的完整流程。从虚拟机配置、系统安装到基础环境设置,提供了实用技巧和常见问题解决方案,帮助开发者高效构建适用于智能视觉处理的开发环境。

weixin_29197699的博客 508

RT-Thread学习笔记(11):互斥量

目录互斥量的优先级继承机制互斥量和二值信号量的区别互斥量的运作机制互斥量控制块 互斥量的优先级继承机制 在RT-Thread操作系统中为了降低优先级翻转问题利用了优先级继承算法。优先级继承算法是指,暂时提高某个占有某种资源的低优先级线程的优先级,使之与在所有等待该资源的线程中优先级最高那个线程的优先级相等,而当这个低优先级线程执行完毕释放该资源时,优先级重新回到初始设定值。因此,继承优先级的线程避免了系统资源被任何中间优先级的线程抢占。 互斥量和二值信号量的区别 互斥量与二值信号量最大的不同是:互斥量具有优

BLBQ962464的博客 1538

Opencv计算相机响应函数(Camera Response Function)与Radiance

本文主要用于记录自己在学习CRF过程中遇到的一些问题。 CRF模型 I=f(V(t⋅L))I=f(V( t\cdot L))I=f(V(t⋅L)) 其中III为相机灰度值Intensity,LLL为环境中irradiance,ttt为曝光时间,VVV为相机镜头参数,fff为相机响应函数CRF。 有些论文中认为相机镜头参数是线性的不考虑,但有些考虑了衰减即靠近图像边缘亮度会暗一些,但没有看到二者同时计算的,如果同时计算两个非线性的函数,我觉得可能会有不确定性,在这里还请教一下了解的朋友。 控制

larrydong的博客 5999

【N32L40X】学习笔记12-规则组+注入组+外部触发启动

使用定时器触发规则通道开始采集数据,采集完成后使用dma传输数据,并启动注入通道转换数据,注入通道转换完成后产生中断,中断中读物注入通道数据。

Car12 422

二进制信号量和互斥信号量的区别

互斥信号量和二进制信号量的区别 互斥量用于线程的互斥,信号量用于线程的同步。这是互斥量和信号量的根本区别,也就是互斥和同步之间的区别。 互斥:是指某一资源同时只允许一个访问者对其进行访问,具有唯一性和排它性。但互斥无法限制访问者对资源的访问顺序,即访问是无序的。 同步:是指在互斥的基础上(大多数情况),通过其它机制实现访问者对资源的有序访问。在大多数情况下,同步已经实现了互斥,特别是所有写入资源的情况必定是互斥的。少数情况是指可以允许多个访问者同时访问资源 以上区别是主要想记住的。 note:信号量可

sensen的博客 2131

LLaMA Factory多卡微调的实战教程(持续更新)

本文主要介绍了LLaMA Factory多卡微调的实战教程(持续更新),希望对学习大语言模型的同学们有所帮助。 文章目录 1. 前言 2. 配置环境 2.1 安装虚拟环境 2.2 安装依赖库 2.3 模型选型与下载 2.4 配置多卡环境 3. 运行代码 3.1 构建训练数据 3.2 修改配置文件 3.3 微调 3.3.1 zero3微调 3.3.2 启动API 3.3.3 模型测试

herosunly的博客 25万+

互斥信号量和二进制信号量

互斥信号量和二进制信号量的区别(转)2009年12月03日 星期四 09:50 A.M.互斥信号量和二进制信号量的区别      互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。       二进制信号量,一个任务申请成功后,可以由另一个任务释放。二进制信号量实现任务互斥:     打印机资源只有一个,abc三个任

kaula457的专栏 1114

windows下宝塔安装教程

windows下宝塔安装教程 目录宝塔是什么?宝塔安装流程1.下载2.配置3.登录4.安装的环境套件小结 宝塔是什么? 宝塔是管理服务器的免费的软件,宝塔上面可以进行对你的服务器批量进行管理,对于运维人员来说还是必不可少的一个软件,值得使用。 宝塔安装流程 1.下载 链接: https://download.bt.cn/win/panel/BtSoft.zip 下载后安装买最好自定义目录,方便找 2.配置 下载完成后会出现这个页面,对着页面进行配置 点击默认密码复制进来,这里注意一点就是一定要查看

你在看屏幕的同时,屏幕也在注视着你 4422

C# Winform使用Monaco打造代码编辑器

本文介绍了如何在Winform项目中集成Monaco代码编辑器。通过NuGet安装WebView2控件,创建monaco-editor.html文件加载编辑器,并实现与C#代码的交互。关键步骤包括:初始化WebView2环境、配置Monaco编辑器参数、设置代码变更监听事件以及处理C#与JavaScript之间的通信。注意事项提示了依赖库安装问题的解决方法。该方案实现了功能完整的代码编辑器,支持代码自动保存和实时显示功能。

遇见--专栏 346

UCOSIII——信号量和互斥信号量详解

前言:   在ucosiii中有可能会有多个任务访问共享资源,同时对这个共享资源操作时会出错,因此信号量最早是用来控制任务存取共享资源。现在信号量被用来实现任务之间的同步和Isr之间的同步。在可剥夺的内核中,当任务独占式使用共享资源时就会出现低优先级任务先于高优先任务运行的现象,这个现象称之为优先级翻转现象。为了解决这个问题,引出了互斥信号量的概念。 1:信号量   信号量是一种上锁机制,该任务必须获得相应的钥匙才能进入,直至代码执行结束,释放钥匙,程序才退出。信号量分两种,一种是二进制信号量,一种是计数型

weixin_38931060的博客 2531

蓝牙攻防实战指南:低功耗蓝牙

Bluetooth Low Energy(也称Bluetooth Smart)是经典蓝牙(Bluetooth Classic)的演进版本,设计目标是实现极低功耗,适用于无需频繁更换电池的设备,如智能手环、健康监测器、蓝牙标签等。Bluetooth Low Energy 是一项极具前景的无线通信技术,它以极低的功耗实现了短距离高效通信,广泛应用于智能设备和物联网领域。然而,其简化的协议结构和配对机制也带来了不小的安全挑战。

idlecloud0105的博客 682

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

互斥信号量和二进制信号量的区别       互斥型信号量必须是同一个任务申请,同一个任务释放,其他任务释放无效。同一个任务可以递归申请。        二进制信号量,一个任务申请成功后,可以由另一个任务释放。 二进制信号量实现任务互斥:     打印机资源只有一个,abc三个任务共享,当a取得使用权后,为了防止其他任务错误地释放了信号量(),必须将打印机房的门关起来

8444

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

信号量和互斥信号量

信号量用来控制任务存取共享资源,实现任务间的同步以及任务和ISR(中断)间同步。 在可剥夺内核中,当任务独占式使用共享资源的时候,会出现低优先级的任务先于高优先级任务运行的现象,这个现象被成武优先级反转,为了解决优先级反转这个问题,UCOSIII引入互斥信号量。 信号量 优先级反转 互斥信号量 ...

学贵有恒 1332

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

xsemaphoretake返回_FreeRTOS 信号量

学习自“zhzht19861011”——FreeRTOS信号量,自己记录使用,想详细了解请看原博客,谢谢朱工的博客一、概念FreeRTOS的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。互斥量不可以用在中断服务程序中,这是因为:互斥量具有优先级继承机制,只有在任务中获取或给出互斥才有意义。中断不能因为等待互斥量而阻塞。互斥量和信号量在用法上...

weixin_39520775的博客 1299

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

FreeRTOS 中的互斥信号量

FreeRTOS中的互斥信号量(Mutex)是一种特殊的二进制信号量,用于保护临界区资源,确保同一时间只有一个任务能够访问共享资源。与普通信号量不同,Mutex具有优先级继承特性,可以有效避免优先级反转问题。本文介绍了Mutex的基本概念、创建方法(使用xSemaphoreCreateMutex())、获取(xSemaphoreTake())和释放(xSemaphoreGive())的操作流程,并通过实验代码展示了如何在实际应用中使用Mutex来同步多任务对共享资源的访问。Mutex是FreeRTOS中实现

愿青春不负梦想 738

UCOSIII信号量和互斥信号量

在UCOSIII中可能会偶多个任务会访问共享资源,因此信号量最早用来控制任务存取共享资源,现在信号量也被用来实现任务间的同步以及任务和ISP同步。在可剥夺的内核中,当任务独占式使用共享资源的时候,会低优的任务高于高级优先任务运行的现象,这个现象叫做优先级反转,未来了解决这个优先级反转的问题,UCOSIII引入可互斥信号量这个概念。信号量 信号量像是一种上锁机制,代码必须获得对应的钥匙才能继续执行,一

z312811966的博客 2816

Vxworks信号量分析(zz)

Vxworks信号量分析(zz) 2010-01-27 16:38 Wind内核中有二进制信号量、计数信号量和互斥信号量三种类型,为了使应用程序具有可移植性,还提供了POSIX(可移植操作系统接口)信号量。 在Vxorks操作系统中,信号量是实现任务同步

fertiland的专栏 1836

FreeRTOS 信号量

FreeRTOS 的信号量包括二进制信号量、计数信号量、互斥信号量(以后简称互斥量)和递归互斥信号量(以后简称递归互斥量)。我们可以把互斥量和递归互斥量看成特殊的信号量。

655
上一篇: LPC3250的nor flash地址线接法
下一篇: 条件编译 #ifndef _HEAD_H...中下划线的理解!
Alan0521
博客等级 码龄19年 77粉丝 6原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值