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

2022-05-27 17:51:12 +08:00
 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() */

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

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

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

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

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

© 2021 V2EX