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