概述
互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。在我们编写 Linux
驱动的时候遇到需要互斥访问的地方建议使用 mutex
。Linux
内核使用 mutex
结构体表示互斥体,定义如下:
struct mutex {
/* 1: unlocked, 0: locked, negative: locked, possible waiters */
atomic_t
count;
spinlock_t
wait_lock;
struct list_head wait_list;
#if defined(CONFIG_DEBUG_MUTEXES) || defined(CONFIG_MUTEX_SPIN_ON_OWNER)
struct task_struct *owner;
#endif
#ifdef CONFIG_MUTEX_SPIN_ON_OWNER
struct optimistic_spin_queue osq; /* Spinner MCS lock */
#endif
#ifdef CONFIG_DEBUG_MUTEXES
void
*magic;
#endif
#ifdef CONFIG_DEBUG_LOCK_ALLOC
struct lockdep_map dep_map;
#endif
};
在使用 mutex
之前要先定义一个 mutex
变量。在使用 mutex
的时候要注意如下几点:
1、mutex
可以导致休眠,因此不能在中断中使用 mutex
,中断中只能使用自旋锁。
2、和信号量一样,mutex
保护的临界区可以调用引起阻塞的 API
函数。
3、因为一次只有一个线程可以持有 mutex
,因此,必须由 mutex
的持有者释放 mutex
。并且 mutex
不能递归上锁和解锁。
有关互斥体的 API
函数如下所示:
函数 | 描述 |
---|---|
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) | 使用此函数获取信号量失败进入休眠以后可以被信号打断 |
最后
以上就是长情乌龟为你收集整理的Linux 驱动开发 三十一:互斥体的全部内容,希望文章能够帮你解决Linux 驱动开发 三十一:互斥体所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复