golang_mutex_lock流程图
2023-03-10 19:06:52 0 举报
golang 锁sync.Mutex 上锁流程图
作者其他创作
大纲/内容
CAS操作,更新state
目标state(new)切换为饥饿模式
Y
是否需要切换为饥饿模式
加入等待队列,等待被唤醒
重置自旋计数
更新是否成功
N
重置woken状态标记
是否处于饥饿模式
Fast Path
SlowPath
目标state(new)上锁
等待队列计数 -1
自旋的G
去除一些无意义的流程
取得锁,更新state
退出饥饿模式
是否是锁定状态
处于自旋的G
解除woken状态
这里因为成功后也是加入到等待队列所以,实际只是尝试计数 +1
回到抢锁的池子
是否需要退出饥饿模式
目标state(new)等待计数+1
自旋
抢锁的G
重新加入到抢锁的池子里与当前处于自旋的goroutine或者新来的goroutine去竞争锁
这里尝试将state设置为锁定
是否是饥饿模式
开始
是否获取成功
更新是否需要切换饥饿模式的标记
取得锁
被唤醒的G
注:这里的池子并不真正存在,只是方便理解(实际是各个抢锁的goroutine一直自循环尝试获取锁)
是否满足自旋条件
被唤醒
是否需要解除woken状态
饥饿模式新来的goroutine都直接进入等待队列
结束
CAS获取锁
这里实际什么都不会做,因为原本就是饥饿模式
收藏
0 条评论
下一页