Mutex 互斥锁

版权声明:本文为博主原创文章,未经博主允许不得转载。
https://blog.csdn.net/huangweiqing80/article/details/83060119

1、理解互斥锁?

互斥锁的使用也是保持内核临界区的同步的,互斥锁可以说源于信号量,信号量设置计数器可以容许n个进程并发的访问临界区,而互斥锁不行,只能容许每次一个进程访问,也就是计数器值为1的信号量,可以这么理解。互斥锁和自旋锁有不同(显然的),互斥锁在中断处理程序中和可延迟函数中都不能使用,因为它是可以睡眠的,只能在进程上下文或者软中断上下文才能使用。

struct mutex {
/* 1: unlocked, 0: locked, negative: locked, possible waiters */
atomic_t count;
spinlock_t wait_lock;
struct list_head wait_list;
};

再解释下struct mutex成员的含义:
count: count是一个原子变量,(关于原子变量不懂的,可以看前面的原子变量文章)。 当count=1代表资源可用,等于0代表资源不可用,加锁状态。 负值代表有等待者。
wait_lock: 是一个自旋锁变量, 用于对wait_list的操作变为原子变量
wait_list : 用于管理那些在获取mutex的进程,在无法获取互斥锁的时候,则把线程放入wait_List队列,让线程进入睡眠。wait_list是一个等待队列的链表头,这个链表将所有等待该互斥锁的进程组成一个链表结构。在这个链表中,存放了正在睡眠的进程链表。内核定义了互斥锁的等待队列结构体:

struct mutex_waiter {
	struct list_head	list;
	struct task_struct	*task;
#ifdef CONFIG_DEBUG_MUTEXES
	void			*magic;
#ifdef CONFIG_MT_DEBUG_MUTEXES
	struct task_struct	*task_wait_on;
#endif
#endif
};

Mutex(互斥锁

你可能感兴趣的:(kernel)