3、小结
文章插图
4、自旋自旋是一种多线程同步机制,当前的进程在进入自旋的过程中会一直保持 CPU 的占用 , 持续检查某个条件是否为真 。
4.1、canSpin
runtime_canSpin(iter)
- CPU核数要大于1,否则自旋没有意义,因为此时不可能有其他协程释放锁
- 当前Goroutine为了获取该锁进入自旋的次数 iter 小于四次
- 当前机器上至少存在一个正在运行 Process
- 处理的运行 G 队列为空,否则会延迟调度
4.2、doSpin
runtime_doSpin()func sync_runtime_doSpin() { procyield(active_spin_cnt)}TEXT runtime·procyield(SB),NOSPLIT,$0-0 MOVL cycles+0(FP), AXagain: PAUSE SUBL $1, AX JNZ again RET
它的实现方法链接到了 sync_runtime_doSpin会执行 30 次
PAUSE
指令,每执行一次再检查是否可以加锁,循环进行 。该过程中,进程仍是执行状态4.3、优势更充分的利用CPU,尽量避免 goroutine 切换 。因为当前申请加锁的 goroutine 拥有CPU,如果经过短时间的自旋可以获得锁,当前协程可以继续运行 , 不必进入阻塞状态 。
对于新来进程一直进行自旋加锁 , 排队中的进程长时间无法拿到锁,则设置饥饿状态,该状态下不允许自旋 。
5、小结
文章插图
- 上来先一个 CAS ,如果锁正空闲 , 并且没人抢 , 那么加锁成功;
- 否则,自旋几次,如果成功 , 也不用加入队列;
- 否则,加入队列;
- 从队列中被唤醒:
- 正常模式:和新来的一起抢锁,大概率失败
- 饥饿模式:肯定拿到锁
推荐阅读
- 抖音怎么设置只有锁屏的动态壁纸(会跳动的兔子动态锁屏壁纸)
- 抖音动态锁屏怎么设置(抖音很火的电脑动态屏保)
- 花西子同心锁口红怎么安装在锁里_花西子同心锁口红怎样拆卸
- pthread_mutex_t & pthread_cond_t 总结
- 国行ps5会锁区吗_国行ps5锁服不锁区
- StampedLock:一个并发编程中非常重要的票据锁
- 我的世界信标怎么用才能最大化(我的世界信标怎么解锁信标属性)
- InnoDB关于事务、锁、MVCC专题
- 苹果动态壁纸怎么设置(苹果设置动态锁屏)
- 荣耀v40有没有指纹解锁_荣耀v40是不是指纹解锁