1、互斥量
- 特殊的二值性信号量
- 互斥量相较于信号量:
- 信号量像交通灯,强调运行步骤。互斥量像锁,强调许可和权限。
- 使用信号量可能导致优先级翻转,互斥量通过优先级继承的方法解决翻转问题。
- rt_mutex_release(不可以在中断里调用)只有当take到才能用,跟信号量不同,可以take信号量A,一个release信号量B。
- 当take到互斥量后,再次take时,hold+1,但是线程不会挂起。
- value是二值的。
- 互斥量的结构体多了后面的三个成员:上次线程的优先级、曾经持有过互斥锁的线程数、当前的拥有者。
-
struct rt_mutex { struct rt_ipc_object parent; /**< inherit from ipc_object */ rt_uint16_t value; /**< value of mutex */ rt_uint8_t original_priority; /**< priority of last thread hold the mutex */ rt_uint8_t hold; /**< numbers of thread hold the mutex */ struct rt_thread *owner; /**< current owner of mutex */ }; typedef struct rt_mutex *rt_mutex_t; //定义静态互斥量:struct rt_mutex static_mutex //定义动态互斥量:rt_mutex_t dynamic_mutex
- 互斥量的相关函数都在ipc.c里面自己查看就行
- 例如ATM机的铁门,每次只允许一个用户可以使用ATM机
二、优先级翻转![](https://i-blog.csdnimg.cn/blog_migrate/a7c66cfa3be7e88fe4c44a9c1c439133.png)
- 可以看到当线程A和C公用一块资源的时候,因为低优先级的C会拖累高优先级的A,而B从中得益。
- 利用优先级继承解决优先级翻转。将低优先级优先级暂时提升。
- 代码实现的关键在于实现优先级的变化,这些不用我们做了。RTT的内核已经写好了。
- 优先级翻转问题提醒我们对共享资源进行互斥访问代码应该尽可能的短。