golang所有goroutines都睡着了之死锁

JeffreyZhao 阅读:137 2025-06-02 22:19:02 评论:0

运行跟随 golang 片段时出现错误。
我认为进度将在 wg.Wait() 处阻塞,直到 go 例程结束。那么该值将从 c1 获得。但它可能不会按预期进行。

func main() { 
 
c1 := make(chan string) 
//var c1 chan string 
var wg sync.WaitGroup 
 
wg.Add(1) 
go func() { 
    defer wg.Done() 
    fmt.Printf("go routine begin\n") 
    time.Sleep(1 * time.Second) 
    c1 <- "one" 
    fmt.Printf("go routine done\n") 
}() 
wg.Wait() 
fmt.Printf("done c1: %v\n", <-c1) 
fmt.Printf("out\n") 
} 

错误信息是,
 go routine begin 
 fatal error: all goroutines are asleep - deadlock! 

请您参考如下方法:

写给 c1永远不会执行,因为从 c1 读取在 wg.Wait() 之后,这将停止到 c1被写入。所以主 goroutine 等待 wg.Wait()嵌套的 goroutine 在 c1 等待写。

您可以使 channel 缓冲,或等待c1在单独的 goroutine 上阅读。


标签:
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

关注我们

一个IT知识分享的公众号