互斥量
优质
小牛编辑
131浏览
2023-12-01
互斥量接口
结构体 | |
struct | rt_mutex |
互斥量控制块 更多... | |
类型定义 | |
typedef struct rt_mutex * | rt_mutex_t |
互斥量类型指针定义 | |
函数 | |
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) |
脱离互斥量 | |
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_take (rt_mutex_t mutex, rt_int32_t time) |
获取互斥量 | |
rt_err_t | rt_mutex_release (rt_mutex_t mutex) |
释放互斥量 | |
详细描述
互斥量接口
互斥量又叫相互排斥的信号量,是一种特殊的二值性信号量。它和信号量不同的是, 它支持互斥量所有权、递归访问以及防止优先级翻转的特性。
互斥量的使用比较单一,因为它是信号量的一种,并且它是以锁的形式存在。 在初始化的时候,互斥量永远都处于开锁的状态,而被线程持有的时候则立刻转为 闭锁的状态。互斥量更适合于:
- 线程多次持有互斥量的情况下。这样可以避免同一线程多次递归持有而造成死锁的问题;
- 可能会由于多线程同步而造成优先级翻转的情况;
函数说明
rt_err_t rt_mutex_init | ( | rt_mutex_t | mutex, |
const char * | name, | ||
rt_uint8_t | flag | ||
) |
初始化互斥量
该函数将初始化互斥锁并将其置于内核管理器的控制之下
- 参数
mutex 互斥量对象的句柄 name 互斥量的名称 flag 互斥量的标志位
- 返回
- RT_EOK 初始化成功
rt_err_t rt_mutex_detach | ( | rt_mutex_t | mutex | ) |
脱离互斥量
该函数将把互斥量对象从内核对象管理器中删除,适用于静态初始化的互斥量。
- 参数
mutex 互斥量对象的句柄
- 返回
- RT_EOK 成功
rt_mutex_t rt_mutex_create | ( | const char * | name, |
rt_uint8_t | flag | ||
) |
创建互斥量
调用该函数创建一个互斥量时,内核首先创建一个互斥量控制块,然后完成对该控制块的初始化工作。
- 参数
name 互斥量的名称 flag 互斥量的标志位
- 返回
- 返回创建的互斥量,失败时返回RT_NULL
- 示例:
- mutex_sample.c , 以及 priority_inversion.c.
rt_err_t rt_mutex_delete | ( | rt_mutex_t | mutex | ) |
删除互斥量
当系统不再使用互斥量时,通过调用该函数删除互斥量以释放系统资源,适用于动态创建的互斥量。
- 参数
mutex 互斥量对象的句柄
- 返回
- RT_EOK 删除成功
rt_err_t rt_mutex_take | ( | rt_mutex_t | mutex, |
rt_int32_t | time | ||
) |
获取互斥量
该函数将获取一个互斥量,如果互斥量没有被其他线程控制,那么申请该互斥量的线程将成功获得该互斥量。 如果互斥量已经被当前线程线程控制,则该互斥量的持有计数加 1,当前线程也不会挂起等待。如果互斥量 已经被其他线程占有,则当前线程在该互斥量上挂起等待,直到其他线程释放它或者等待时间超过指定的 超时时间。
- 参数
mutex 互斥量对象的句柄 time 指定的等待时间
- 返回
- RT_EOK 成功获得互斥量;-RT_ETIMEOUT 超时;-RT_ERROR 获取失败
- 示例:
- mutex_sample.c , 以及 priority_inversion.c.
rt_err_t rt_mutex_release | ( | rt_mutex_t | mutex | ) |
释放互斥量
使用该函数接口时,只有已经拥有互斥量控制权的线程才能释放它,每释放一次该互斥量, 它的持有计数就减 1。当该互斥量的持有计数为零时(即持有线程已经释放所有的持有操作), 它变为可用,等待在该信号量上的线程将被唤醒。如果线程的运行优先级被互斥量提升, 那么当互斥量被释放后,线程恢复为持有互斥量前的优先级。
- 参数
mutex 互斥量对象的句柄
- 返回
- RT_EOK 成功
- 示例:
- mutex_sample.c , 以及 priority_inversion.c.