下面的代码为什么会死锁?fatal error: all goroutines are asleep - deadlock!

xulc2021 · 2023-04-10 12:48:28 · 1359 次点击 · 大约8小时之前 开始浏览    置顶
这是一个创建于 2023-04-10 12:48:28 的主题,其中的信息可能已经有所发展或是发生改变。

123456.png


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

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

1359 次点击  
加入收藏 微博
8 回复  |  直到 2023-04-11 11:22:55
xulc2021
xulc2021 · #1 · 2年之前

有没有 老gopher来帮我解答一下~

jan-bar
jan-bar · #2 · 2年之前
xulc2021xulc2021 #1 回复

有没有 老gopher来帮我解答一下~

go的锁是不可重入锁。。感觉是你A里面lock后再到C里面lock。。

xulc2021
xulc2021 · #3 · 2年之前

这个我去测试 把B中的Sleep去掉,程序能正常跑,并输出结果。 但是加上Sleep就100%报错,不知道为什么。。。

xulc2021
xulc2021 · #4 · 2年之前
jan-barjan-bar #2 回复

#1楼 @xulc2021 go的锁是不可重入锁。。感觉是你A里面lock后再到C里面lock。。

谢谢~了解了一个不知道的知识点。

xulc2021
xulc2021 · #5 · 2年之前

解答:根据 sync/rwmutex.go 中,读写锁的注释可以知道,读写锁当有⼀个协程在等待写锁时,其他协程是不能获得读锁的,⽽在 A 和 C 中同⼀个调⽤链中间需要让出读锁,让写锁优先获取,⽽ A 的读锁⼜要求 C 调⽤完成,因此死锁。

sanrentai
sanrentai · #6 · 2年之前

A和C显而易见的死锁啊

hupeng
hupeng · #7 · 2年之前
xulc2021xulc2021 #3 回复

这个我去测试 把B中的Sleep去掉,程序能正常跑,并输出结果。 但是加上Sleep就100%报错,不知道为什么。。。

A和C可以同时加读锁,如果把B中的sleep 5 去掉,因为main中sleep 2,所以在sleep 2结束前,go A已经执行完了,m.Lock和ABC中的锁不会有冲突,不知道我理解的对不对?

hupeng
hupeng · #8 · 2年之前

我理解是C中的Rlock和main中的Lock造成了死锁

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