关于 go 无缓冲 channel 的 deadlock 问题!

2022 年 5 月 27 日
 koujianshusheng

package main

import ( "fmt" "net" )

var temp net.IP

func main() { fmt.Println("start......") ch := make(chan int) <-ch fmt.Println("hello world") }

/* start......

*/

package main

import ( "fmt" )

func main() { fmt.Println("start......") ch := make(chan int) <-ch fmt.Println("hello world") }

/* start...... fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]: main.main() */

2679 次点击
所在节点    Go 编程语言
10 条回复
koujianshusheng
2022 年 5 月 27 日
一个堵塞一个死锁,就因为 net 包?
youngzy
2022 年 5 月 27 日
第一个应该也是死锁,没有创建新的协程,主协程阻塞。
去 play ground 试试?
koujianshusheng
2022 年 5 月 27 日
@youngzy 我是在本地环境运行的,play ground 会死锁,但是本地没有
codehz
2022 年 5 月 27 日
引用 cgo 的包(包括 net )就会关闭死锁检测器
koujianshusheng
2022 年 5 月 27 日
@codehz 这个说法有参考资料吗,亲
iBugOne
2022 年 5 月 27 日
koujianshusheng
2022 年 5 月 27 日
@iBugOne 感谢
lysS
2022 年 5 月 27 日
无论是否 import net ,我这里都是 17 没有报错,18 报错
lysS
2022 年 5 月 27 日
知道了,net 没有 cgo ,可以 import "C"来检测
zuokanyunqishi
2022 年 5 月 27 日
go1.18.1 复现。。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/855720

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX