go锁-互斥锁

go锁-互斥锁

go锁-互斥锁_第1张图片

sema初始值是0,waitershift等待协程的数量

go锁-互斥锁_第2张图片

正常枷锁:

尝试CAS直接加锁,通过原子包给lockerd 为枷锁
若无法直接获取,进行多次自旋尝试,未获取到的锁的g  ,多次执行空语句,多次尝试获取锁
多次尝试失败,sema为0获取不到,进入sema队列休眠,等待个数加1

go锁-互斥锁_第3张图片

正常模式解锁

解锁后,检查有没有协程在等待,会唤醒一个协程,拿出一个协程放到调度器里面运行,被拿出的协程不能直接获得锁,还有其他协程在竞争锁

go锁-互斥锁_第4张图片

锁饥饿

当前协程等待锁的时间超过了1ms,切换到饥饿模式

饥饿模式中,不自旋,新来的协程直接sema休眠

饥饿模式中,被唤醒的协程直接获取锁

没有协程在队列中继续等待时,回到正常模式

你可能感兴趣的:(Go,go)