1、互斥量特性
互斥量是一种特殊的二进制信号量。
每个线程在对资源操作前都尝试先加锁,成功加锁才能操作,操作结束后解锁。
资源还是共享的,线程间也还是竞争的,但通过锁将资源的访问变为互斥操作,而后与时间有关的错误也不会在产生了。
注意:同一个时刻,只能有一个线程持有该锁。
在有多线程访问共享资源时使用。
2、互斥量函数
使用互斥量时,先创建,然后获取,再释放。
2.1、互斥量创建
要想使用互斥量,需要在配置文件FreeRTOSsConfig.h中定义:
#define configUSE_MUTEXES 1
- 动态创建
//函数内部会同台分配互斥量结构体
SemaphoreHandle_t xSemaphoreCreateMutex( void );
参数 | 描述 |
---|---|
返回值 | 成功则返回句柄 |
- 静态创建
SemaphoreHandle_t xSemaphoreCreateMutexStatic( StaticSemaphore_t *pxMutexBuffer );
参数 | 描述 |
---|---|
pxMutexBuffer | 创建一个StaticSemaphore_t类型 结构体,用来保存信号量结构体 |
返回值 | 成功则返回句柄 |
2.2、获取、释放、删除互斥量
互斥量是一种特殊的信号量,所以获取、释放、删除的API基本和信号量的通用。
互斥量的获取、释放一般不在中断中执行,所以此处无FromISR结尾函数。
/*
* xSemaphore: 信号量句柄,你要删除哪个信号量, 互斥量也是一种信号量
* 删除互斥量
*/
void vSemaphoreDelete( SemaphoreHandle_t xSemaphore );
/* 释放 */
BaseType_t xSemaphoreGive( SemaphoreHandle_t xSemaphore );
/* 获得 */
BaseType_t xSemaphoreTake(
SemaphoreHandle_t xSemaphore,
TickType_t xTicksToWait
);
3、互斥锁的优先级反转和优先级继承
- 互斥锁的优先级反转是指在多线程环境下,一个低优先级的任务持有了一个高优先级任务需要的资源(低优先级持有一把互斥锁,此时有高优先级任务需要获取同一把锁),导致高优先级任务无法继续执行的情况。这种情况下,低优先级任务会"反转"成为当前的”最高优先级“任务,从而延迟了高优先级任务的执行。
- 优先级继承是当一个高优先级任务请求锁时,如果该锁已经被低优先级任务所持有,那么低优先级任务的优先级会被提升到高优先级任务的优先级,以保证高优先级任务能够及时地访问资源并完成工作。一旦低优先级任务释放了锁,其优先级会恢复到原来的值。