互斥量
互斥量
互斥量
通过将信号量设置为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,如果失 |
int mutex_is_locked(struct mutex *lock) |
判断 mutex 是否被获取,如果是的话就返回 |
int mutex_lock_interruptible(struct mutex *lock) |
使用此函数获取信号量失败进入休眠以后可 |
互斥体的使用示例
图 2 互斥体变量使用流程