十九、互斥量(互斥锁)
创始人
2025-05-31 19:32:43
0

文章目录

  • 1、基本概念
  • 2、使用场景:用于实现对临界资源的独占式处理(能够解决使用资源冲突问题,即只有一个资源,但很多任务都想使用时)
  • 3、如何理解互斥量的必要性
  • 4、创建互斥量
  • 5、删除互斥量
  • 6、释放互斥量(即开锁)
  • 7、获得互斥量(即上锁)
  • 8、死锁问题
    • (1)如何理解死锁
    • (2)如何解决死锁问题

1、基本概念

在这里插入图片描述

互斥量即互斥信号量,是特殊的二值信号量,比二值信号量多了一个优先级继承,它与信号量不同的是,它支持互斥量所有权、递归访问以及防止优先级翻转的特性,用于实现对临界资源的独占式处理。

任何时刻互斥量的状态只有两种:开锁和闭锁。

​ 当互斥量被任务持有时,该互斥量处于闭锁状态,这个任务获得互斥量的所有权。释放互斥量时,则处于开锁状态。

​ 当一个任务持有互斥量时,其他任务不能再对该互斥量进行开锁或持有。持有该互斥量的任务也能够再次获得这个锁而不被挂起,即递归访问。

​ 实行同步二值信号量是最好的选择,互斥量更多的是用于保护资源的互锁。

2、使用场景:用于实现对临界资源的独占式处理(能够解决使用资源冲突问题,即只有一个资源,但很多任务都想使用时)

如何理解互斥量的使用场景:(互斥量也被称为互斥锁)
1)互斥量初始值为 1
2)任务 A 想访问临界资源,先获得并占有互斥量,然后开始访问
3)任务 B 也想访问临界资源,也要先获得互斥量:被别人占有了,于是阻塞
4)任务 A 使用完毕,释放互斥量;任务 B 被唤醒、得到并占有互斥量,然后开始访问临界资源
5)任务 B 使用完毕,释放互斥量
正常来说:在任务 A 占有互斥量的过程中,任务 B、任务 C 等等,都无法释放互斥量。但是 FreeRTOS 未实现这点:任务 A 占有互斥量的情况下,任务 B 也可释放互斥量。

3、如何理解互斥量的必要性

优先级继承:
即当低优先级的任务获取了互斥量还没释放时,一个高优先级的任务也想获取互斥量,此时高优先级的任务会获取互斥量失败,当它愿意等待互斥量时会将低优先级的任务的优先级暂时提高到和自己的一样,直到其释放互斥量的时候再恢复其原来的优先级并换唤醒刚等待互斥量的任务。(借助下图理解)
在这里插入图片描述

4、创建互斥量

/* 创建一个互斥量,返回它的句柄。
* 此函数内部会分配互斥量结构体
* 返回值: 返回句柄,非 NULL 表示成功
*/
SemaphoreHandle_t xSemaphoreCreateMutex( void );
/* 创建一个互斥量,返回它的句柄。
* 此函数无需动态分配内存,所以需要先有一个 StaticSemaphore_t 结构体,并传入它的指
针
* 返回值: 返回句柄,非 NULL 表示成功
*/
SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer );

5、删除互斥量

 xSemaphore: 信号量句柄,你要删除哪个信号量, 互斥量也是一种信号量
*/
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );

6、释放互斥量(即开锁)

/* 释放 */
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
/* 释放(ISR 版本) */
BaseType_t xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphoreBaseType_t *pxHigherPriorityTaskWoken);

7、获得互斥量(即上锁)

/* 获得 */
BaseType_t xSemaphoreTake(SemaphoreHandle_t xSemaphore,TickType_t xTicksToWait);
/* 获得(ISR 版本) */
xSemaphoreGiveFromISR(SemaphoreHandle_t xSemaphore,BaseType_t *pxHigherPriorityTaskWoken);

8、死锁问题

(1)如何理解死锁

在这里插入图片描述

(2)如何解决死锁问题

递归锁解决了FreeRTOS中开关锁的缺陷,即实现了谁上锁就由谁解锁
在这里插入图片描述

相关内容

热门资讯

iPhone手机怎么玩安卓系统... 你有没有想过,你的iPhone手机竟然也能玩安卓系统?没错,就是那个一直以来让你觉得遥不可及的安卓世...
平板删安卓系统更新不了,原因及... 最近是不是你也遇到了这样的烦恼?平板电脑上的安卓系统更新不了,是不是让你头疼得要命?别急,今天就来给...
苹果组装机安卓系统卡,卡顿背后... 你有没有发现,最近用苹果手机的时候,有时候系统有点卡呢?这可真是让人头疼啊!你知道吗,其实这背后还有...
安卓系统原生浏览器,功能与体验... 你有没有发现,每次打开手机,那个小小的浏览器窗口总是默默无闻地在那里,陪你浏览网页、搜索信息、看视频...
安卓机如何上苹果系统,跨平台体... 你是不是也和我一样,对安卓机和苹果系统之间的切换充满了好奇?想象你的安卓手机里装满了各种应用,而苹果...
安卓导入系统证书失败,原因分析... 最近在使用安卓手机的时候,你是不是也遇到了一个让人头疼的问题——导入系统证书失败?别急,今天就来给你...
安卓原生系统有哪些手机,盘点搭... 你有没有想过,为什么有些手机用起来就是那么流畅,那么顺心呢?这背后可大有学问哦!今天,就让我带你一起...
安卓系统关机了怎么定位,安卓系... 手机突然关机了,是不是有点慌张呢?别担心,今天就来教你一招,让你的安卓手机即使关机了,也能轻松定位到...
安卓系统游戏加速器,畅享无延迟... 你有没有发现,手机游戏越来越好玩了?不过,有时候游戏体验可能并不那么顺畅,是不是因为手机性能不够强大...
安卓4系统天气功能,尽在掌握 安卓4系统天气功能大揭秘在当今这个数字化的世界里,手机已经不仅仅是一个通信工具,它更是一个集成了各种...
安卓系统如何玩碧蓝幻想,攻略与... 你有没有想过,在安卓系统上玩《碧蓝幻想》竟然可以这么酷炫?没错,就是那个让你沉迷其中的二次元大作!今...
安卓系统搜不到图朵,图朵生成之... 最近是不是你也遇到了这样的烦恼?手机里明明有那么多美美的图片,但是用安卓系统搜索的时候,却怎么也找不...
魁族8刷安卓系统,系统升级后的... 哇,你知道吗?最近在安卓系统圈子里,有一个话题可是引起了不小的轰动,那就是魁族8刷安卓系统。你是不是...
微信正版安装安卓系统,畅享沟通... 你有没有想过,你的微信是不是正版安装的安卓系统呢?这可不是一个小问题哦,它关系到你的微信使用体验和隐...
电视能刷安卓系统吗,电视也能刷... 电视能刷安卓系统吗?揭秘智能电视的无限可能想象你家的电视不再只是用来观看节目的工具,而是变成了一个功...
安卓系统开通通知功能,畅享智能... 你知道吗?最近安卓系统更新后,新增了一个超级实用的功能——开通通知功能!这可是个大喜事,让咱们的生活...
苹果系统安卓爱思助手,系统兼容... 你有没有发现,手机的世界里,苹果系统和安卓系统就像是一对欢喜冤家,总是各有各的粉丝,各有各的拥趸。而...
安卓系统占用很大内存,揭秘内存... 手机里的安卓系统是不是让你感觉内存不够用,就像你的房间堆满了杂物,总是找不到地方放新东西?别急,今天...
安卓系统p30,安卓系统下的摄... 你有没有发现,最近安卓系统P30在手机圈里可是火得一塌糊涂呢!这不,我就来给你好好扒一扒这款手机的那...
siri被安卓系统进入了,智能... 你知道吗?最近科技圈可是炸开了锅,因为一个大家伙——Siri,竟然悄悄地溜进了安卓系统!这可不是什么...