go sync.Mutex 的 Woken 位可能会导致无限饥饿?

DZGodly · · 744 次点击 · 开始浏览    置顶

Lock 方法里的自旋逻辑会将 Mutex 的 Woken位 置为1。 ```go if !awoke && old&mutexWoken == 0 && old>>mutexWaiterShift != 0 && atomic.CompareAndSwapInt32(&m.state, old, old|mutexWoken) { awoke = true } ``` 但是 Unlock 方法里会在 Woken 位 =1 时 return(不唤醒等待队列中的协程) ```go if old>>mutexWaiterShift == 0 || old&(mutexLocked|mutexWoken|mutexStarving) != 0 { return } ``` 在一些严苛的情景下,比如持续有新的协程走自旋逻辑去维持 Woken位为1,那等待队列中的协程就永远不会被唤醒了。。。 有没有大佬来一起讨论下

有疑问加站长微信联系(非本文作者)

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

744 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传