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可能会休眠导致中断阻塞,这是不可接受的。

posted @ 2023-05-01 15:58  人民广场的二道贩子  阅读(14)  评论(0编辑  收藏  举报