互斥锁(mutex)的使用

互斥锁的使用范围:
互斥锁(Mutex)是在原子操作API的基础上实现的信号量行为。互斥锁不能进行递归锁定或解锁,能用于交互上下文但是不能用于中断上下文,同一时间只能有一个任务持有互斥锁,而且只有这个任务可以对互斥锁进行解锁。当无法获取锁时,线程进入睡眠等待状态。
互斥锁的数据结构:

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 */

#ifdef CONFIG_DEBUG_MUTEXES

void *magic;

#ifdef CONFIG_DEBUG_LOCK_ALLOC

struct lockdep_map dep_map;

};

结构体成员说明:

1、atomic_t count;
指示互斥锁的状态:1 没有上锁,可以获得;0 被锁定,不能获得。初始化为没有上锁。

2、spinlock_t wait_lock;
等待获取互斥锁中使用的自旋锁。在获取互斥锁的过程中,操作会在自旋锁的保护中进行。初始化为为锁定。

3、struct list_head wait_list;
等待互斥锁的进程队列。

如何使用互斥锁
第一步:是要定义一把锁:
很简单咯,struct mutex st_mutex_xxx;

第二步:初始化互斥锁
mutex_init

第三步 上锁:
你定义了锁就是为了使用它,那么我们就说一下三种上锁的方法把:
第一,void mutex_lock(struct mutex *lock);
这个函数无法获得锁时就会睡眠,直到可以获取这把锁,这期间是不能被信号打断的。
第二,int mutex_trylock(struct mutex *lock);
看名字就知道是第一个函数的非阻塞版本,尝试去加锁,锁上了返回1,没锁上返回0;
第三, int mutex_lock_interruptible(struct mutex *lock);
和mutex_lock()一样,也是获取互斥锁。在获得了互斥锁或进入睡眠直到获得互斥锁之后会返回0。如果在等待获取锁的时候进入睡眠状态收到一个信号(被信号打断睡眠),则返回_EINIR。

第四步:解锁
void mutex_unlock(struct mutex *lock);

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

smile_5me

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值