互斥量

互斥量

互斥量

通过将信号量设置为1,也可以实现信号量的互斥访问。在os中,提供一种专门的机制-互斥体,来进行互斥访问。

互斥体访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。在互斥访问的场景尽量使用互斥体-mutex。

互斥体数据结构

互斥体数据结构文件:include/linux/mutex.h

图 1 互斥体数据结构

使用互斥体需要先定义一个互斥变量。在使用mutex的注意事项有下面几个方面:

互斥体可以引起休眠,由此在中断中不要使用mutex。中断要使用自旋锁,而且在中中,不能使用引起休眠或阻塞的函数。

其是一种特殊的信号量,mutex保护的临界区可以调用引起阻塞的api函数

只有一个线程可以持有mutex,由此不能递归上锁或解锁。

而且,原则上,必须有持有mutex的线程来释放mutex,这个在代码设计上要注意。

但是在原理上无法规避,就是可以由非持有mutex线程来解锁。

互斥体的接口函数

函数

描述

DEFINE_MUTEX(name)

定义并初始化一个 mutex 变量。

void mutex_init(mutex *lock)

初始化 mutex。

void mutex_lock(struct mutex *lock)

获取 mutex,也就是给 mutex 上锁。如果获
取不到就进休眠。

void mutex_unlock(struct mutex *lock)

释放 mutex,也就给 mutex 解锁。

int mutex_trylock(struct mutex *lock)

尝试获取 mutex,如果成功就返回 1,如果失
败就返回 0。

int mutex_is_locked(struct mutex *lock)

判断 mutex 是否被获取,如果是的话就返回
1,否则返回 0。

int mutex_lock_interruptible(struct mutex *lock)

使用此函数获取信号量失败进入休眠以后可
以被信号打断。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

互斥体的使用示例

图 2 互斥体变量使用流程

posted @ 2022-07-31 16:11  JwChu  阅读(72)  评论(0编辑  收藏  举报