互斥锁(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);

你可能感兴趣的:(Linux,Kernel)