golang所有goroutine都在睡觉-死锁

问题描述 投票:0回答:2

[按照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!
go deadlock channel
2个回答
0
投票

c1的写入将永远不会执行,因为对c1的读取是在wg.Wait()之后,它将停止直到写入c1。因此,主goroutine在wg.Wait()等待,而嵌套goroutine在c1写等待。

您可以缓冲通道,或等待在单独的goroutine上读取c1


0
投票

在Golang中,无缓冲通道上的写操作被阻止。从文档中很明显。

您的执行被阻止在

c1 <- "one"

[延期陈述

defer wg.Done()

从不执行。

© www.soinside.com 2019 - 2024. All rights reserved.