golang mutex 执行流程

自旋:busy-watting 快,但是占用cpu
互斥:sleep-watting 慢(内核上下文切换),但是长期等待优势,不占用cpu

golang的mutex有自旋也有互斥

流程:
一开始正常模式,尝试获取锁,如果获取失败那么尝试自旋busy-waitting(至少有个本地的P队列,并且本地的P队列可运行G队列为空;即保证至少有一个核让其自旋;且自旋也不是直接忙等,是使用底层的pause指令;),自旋超过一定限制,进入队列,休眠等待信号,sleep-watting
此时队列和新的自旋协程竞争,当对头经过时间t后却拿不到锁,那么进入饥饿模式,即所有新的竞争者入队列排队,直到队列头部获取锁时间小于t,然后恢复到正常模式。

参考:
https://zhuanlan.zhihu.com/p/27608263
https://blog.csdn.net/thatboyNB/article/details/116998612?utm_source=app&app_version=4.16.0&code=app_1562916241&uLinkId=usr1mkqgl919blen

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容