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
。