互斥量

优质
小牛编辑
135浏览
2023-12-01

互斥量接口

结构体

struct  rt_mutex
 互斥量控制块 更多...
 

类型定义

typedef struct rt_mutexrt_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_delete
rt_mutex_t rt_mutex_create(const char * name,
rt_uint8_t flag 
)

创建互斥量

调用该函数创建一个互斥量时,内核首先创建一个互斥量控制块,然后完成对该控制块的初始化工作。

参数
name互斥量的名称
flag互斥量的标志位
返回
返回创建的互斥量,失败时返回RT_NULL
参见
rt_mutex_init
示例:
mutex_sample.c , 以及 priority_inversion.c.
rt_err_t rt_mutex_delete(rt_mutex_t mutex)

删除互斥量

当系统不再使用互斥量时,通过调用该函数删除互斥量以释放系统资源,适用于动态创建的互斥量。

参数
mutex互斥量对象的句柄
返回
RT_EOK 删除成功
参见
rt_mutex_detach
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.