互斥量又叫相互排斥的信号量,是一种特殊的二值信号量。互斥量类似于只有一个车位的停车场:当有一辆车进入的时候,将停车场大门锁住,其他车辆在外面等候。当里面的车出来时,将停车场大门打开,下一辆车才可以进入。
互斥量工作机制
- 拥有互斥量的进程拥有互斥量的所有权
- 互斥量支持递归访问且能防止线程优先级翻转
- 互斥量只能由持有线程释放,信号量则可以由任何线程释放
- 互斥量的状态只有两种,开锁或闭锁,当线程持有这个互斥量时,互斥量闭锁,线程释放互斥量时,互斥量开锁
- 互斥量如何解决优先级翻转,优先级翻转是指优先级高的线程由于某些原因被挂起,而优先级低的线程先被执行,而互斥量解决优先级翻转的措施是再优先级低的线程使用互斥量时,互斥量有一个优先级继承协议,这个协议会把当前使用用互斥量的线程的优先级提高到较高级别,从而使得优先级比它高的线程无法抢占它,而其他优先级高且需要使用互斥量的线程也不会被很多优先级较低的线程阻塞
- 在获得互斥量后,请尽快释放互斥量,并且在持有互斥量的过程中,不得再行更改持有互斥量线程的优先级,否则可能人为引入无界优先级反转的问题。
互斥量控制块
struct rt_mutex
{
struct rt_ipc_object parent; /* 继承自 ipc_object 类 */
rt_uint16_t value; /* 互斥量的值 */
rt_uint8_t original_priority; /* 持有线程的原始优先级 */