互斥锁与自旋锁

互斥锁

假如在一个多核CPU中,coreA运行的A线程通过调用pthread_mutex_lock去获得一个临界区的互斥锁,然后coreB中运行的B线程也调用pthread_mutex_lock去获取互斥锁,B线程就会被阻塞,coreB就会执行上下文切换,把B线程调度到等待队列中,然后coreB就可以继续调度执行位于就绪队列中的其他线程。

互斥锁适合用在持锁时间比较长的操作,如:
1 临界区有IO操作
2 临界区代码复杂或者循环量大
3 临界区竞争非常激烈
4 单核处理器

自旋锁

线程A调用pthread_spin_lock去获取自旋锁,然后线程B也调用pthread_spin_lock去获取自旋锁,线程B就会一直循环不停的进行获取锁请求(消耗CPU资源),直到得到这个锁为止。

自旋锁适合用在临界区持锁时间非常短且CPU资源不紧张的情况下,自旋锁一般用于多核的服务器。

自旋锁在单核非抢占式CPU上是无效的.被设为空操作,不做任何事。

自旋锁有几个重要的特性:
1、被自旋锁保护的临界区代码执行时不能进入休眠。
2、被自旋锁保护的临界区代码执行时是不能被被其他中断中断。
3、被自旋锁保护的临界区代码执行时,内核不能被抢占。
从这几个特性可以归纳出一个共性:被自旋锁保护的临界区代码执行时,它不能因为任何原因放弃处理器。

linux上的自旋锁有三种实现:

  1. 在单cpu,不可抢占内核中,自旋锁为空操作。
  2. 在单cpu,可抢占内核中,自旋锁实现为“禁止内核抢占”,并不实现“自旋”。(注意)
  3. 在多cpu,可抢占内核中,自旋锁实现为“禁止内核抢占” + “自旋”。

引用:自旋锁死锁
引用:互斥锁与自旋锁的区别

posted @ 2020-10-11 20:16  gitfong  阅读(233)  评论(0编辑  收藏  举报