当前位置:嗨网首页>书籍在线阅读

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 /