我是靠谱客的博主 长情乌龟,最近开发中收集的这篇文章主要介绍Linux 驱动开发 三十一:互斥体,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。在我们编写 Linux 驱动的时候遇到需要互斥访问的地方建议使用 mutexLinux 内核使用 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 驱动开发 三十一:互斥体所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(40)

评论列表共有 0 条评论

立即
投稿
返回
顶部