22 同步与互斥(八)总结
1 实现的基础
同步与互斥的基本操作:spinlock;semaphore;mutex
而实现上述操作的基本是基于:原子操作;中断屏蔽;抢占屏蔽来实现的
对于spinlock;semaphore;mutex等相关的操作,基本实现都是lock时,放回成功表示上锁成功。
否则就需要等待对应unlock后才能返回成功,进入临界区
2 彼此的关联与区别
2.1 spinlock与semaphore mutex
- semaphore和mutex的实现都依赖于spinlock。所以spinlock相对于semaphore、mutex更加底层
- spinlock不会休眠;而semaphore和mutex会休眠
2.2 semaphore与mutex
mutex可以认为是semaphore的一种特殊实现。
semaphore的count可以为任意值,并无限制。而mutex中count只能为0(lock),1(unlock),-1(lock wait)
semaphore | mutex | |
---|---|---|
几把锁 | 任意,可设置 | 1 |
谁能解锁 | 别的程序、中断等都可以 | 谁加锁,就得由谁解锁(一般,最好) |
多次解锁 | 可以 | 不可以,因为只有1把锁 |
循环加锁 | 可以 | 不可以,因为只有1把锁 |
任务在持有锁的期间可否退出 | 可以 | 不建议,容易导致死锁 |
硬件中断、软件中断上下文中使用 | 可以 | 不可以 |
对于内核而言推荐使用mutex
3 lock的使用原则
3.1 irq、irqsave、bh等使用原则
行与列事件竞争时,需要使用的lock类型
3.2 spinlock与mutex的使用原则
-
临界区很小使用spinlock;临界区很大使用mutex
-
临界区存在阻塞(即上下文的切换),不能使用spinlok,需要使用mutex。
因为spinlock会去禁止抢占,并spin。可能导致死锁或崩溃。详见同步与互斥的spinlock一章
-
在中断中只能使用spinlock。因为mutex可能会休眠导致中断阻塞,这是不可接受的。