18-互斥体
7.6 互斥体
尽管信号量已经可以实现互斥的功能,而且包含DECLARE_MUTEX()、init_MUTEX ()等定义信号量的宏或函数,从名字上看就体现出了互斥体的概念,但是“正宗”的mutex在Linux内核中还是真实地存在着。
下面代码定义名为my_mutex的互斥体并初始化它:
struct mutex my_mutex;
mutex_init(&my_mutex);
下面的两个函数用于获取互斥体:
void inline _ _sched mutex_lock(struct mutex *lock);
int _ _sched mutex_lock_interruptible(struct mutex *lock);
int _ _sched mutex_trylock(struct mutex *lock);
mutex_lock()与mutex_lock_interruptible()的区别和down()与down_trylock()的区别完全一致,前者引起的睡眠不能被信号打断,而后者可以。mutex_trylock()用于尝试获得mutex,获取不到mutex时不会引起进程睡眠。
下列函数用于释放互斥体:
void __sched mutex_unlock(struct mutex *lock);
mutex的使用方法和信号量用于互斥的场合完全一样:
struct mutex my_mutex; / 定义mutex /
mutex_init(&my_mutex); / 初始化mutex /
mutex_lock(&my_mutex); / 获取mutex /
.../ 临界资源/
mutex_unlock(&my_mutex); / 释放mutex /