Mutex锁的使用
| 函数定义 | 功能说明 | 
|---|---|
| mutex_lock(struct mutex *lock) | 加锁,如果不可用,则睡眠(UNINTERRUPTIBLE) | 
| mutex_lock_interruptible(struct mutex *lock); | 加锁,如果不可用,则睡眠(TASK_INTERRUPTIBLE) | 
| mutex_unlock(struct mutex *lock) | 解锁 | 
| mutex_trylock(struct mutex *lock) | 试图获取指定的 mutex,或得到返回1,否则返回 0 | 
| mutex_is_locked(struct mutex *lock) | 如果 mutex 被占用返回1,否则返回 0 | 
Mutex锁和其他锁的区别
- mutex一种睡眠锁,其行为和 count 为 1 的信号量类似,但是不同于信号量,- mutex需要谁拿的锁谁来释放锁
- 不同于自旋锁,mutex临界区允许睡眠
- 不同于自旋锁,mutex在拿锁时若锁被别人持有,会根据锁的持有者是否正在运行来决定是乐观自旋或是睡眠等待
Mutex锁的实现
	以上两篇文章介绍的比较好,可以参考看一下,总结一下mutex的特点
- mutex由于性能原因并不是绝对公平调度的,允许偷锁的情况,但是为了相对公平引入了- handoff机制,让被偷锁的进程在下次一定可以获取锁。
- mutex锁有自旋锁和信号量的特点,即当持有锁的进程处于执行状态时,等待锁的进程会关闭抢占进行自旋;若持有锁的进程处于睡眠状态时,等待锁的进程也会进行休眠,和信号量的表现一致。
- 信号量和mutex锁优选mutex。