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。