互斥量的概念
在 RT-Thread 中,互斥量(Mutex,互斥锁)用于确保共享资源在任意时刻只被一个线程访问
- 确保共享资源的互斥访问:互斥量用于保护对共享资源的访问,确保在任意时刻只有一个线程可以访问该资源;避免多个线程同时修改共享资源而导致的数据不一致或竞态条件
- 实现临界区保护:互斥量通常用于实现临界区保护,将对共享资源的访问限制在临界区内。只有获取了互斥量的线程才能进入临界区,其他线程需要等待互斥量释放后才能进入
- 防止死锁和资源竞争:RT-Thread 的互斥量实现通常会考虑死锁和资源竞争的问题
- 提供更细粒度的同步机制:相比信号量,互斥量提供了更细粒度的同步机制;它通常用于保护单个共享资源或临界区,而信号量则更适合用于限制对资源数量的访问
互斥量只有两个状态:被锁定和未锁定
即当一个低优先级任务持有互斥量时,系统会提升其优先级到需要访问该资源的最高优先级任务的优先级,以防止高优先级任务被阻塞(优先级翻转)
互斥量相关接口
创建互斥量
rt_mutex_t rt_mutex_create(const char *name, rt_uint8_t flag);
删除互斥量
rt_err_t rt_mutex_delete(rt_mutex_t mutex);
初始化互斥量
rt_err_t rt_mutex_init(rt_mutex_t mutex, const char *name, rt_uint8_t flag);
脱离互斥量
rt_err_t rt_mutex_detach(rt_mutex_t mutex);
获取互斥量
- 如果互斥量没有被其他线程控制,那么申请该互斥量的线程将成功获得该互斥量;
- 如果互斥量已经被当前线程线程控制,则该互斥量的持有计数加 1,当前线程也不会挂起等待;
- 如果互斥量 已经被其他线程占有,则当前线程在该互斥量上挂起等待,直到其他线程释放它或者等待时间超过指定的 超时时间
rt_err_t rt_mutex_take(rt_mutex_t mutex, rt_int32_t time);
释放互斥量
只有已经拥有互斥量控制权的线程才能释放它,每释放一次该互斥量,它的持有计数就减1;
当该互斥量的持有计数为零时(即持有线程已经释放所有的持有操作),它变为可用,等待在该信号量上的线程将被唤醒
如果线程的运行优先级被互斥量提升, 那么当互斥量被释放后,线程恢复为持有互斥量前的优先级。
rt_err_t rt_mutex_release(rt_mutex_t mutex);