与 GO 等待组同步

为什么这是示例 1 中的死锁,并且在示例 2 中没有死锁或打印任何内容?


示例 1。)


func main() {


    w := sync.WaitGroup{}

    w.Add(4)

    c := make(chan int)


    go func() { c <- 1; w.Done() }()

    go func() { c <- 2; w.Done() }()

    go func() { c <- 3; w.Done() }()


    go func() { println(len(c)); w.Done() }()


    w.Wait()

}

示例 2。)


func main() {

    w := sync.WaitGroup{}

    w.Add(3)

    c := make(chan int)


    go func() { c <- 1; w.Done() }()

    go func() { c <- 2; w.Done() }()

    go func() { c <- 3; w.Done() }()


    go func() { w.Wait(); println(len(c)) }()

}


森栏
浏览 105回答 2
2回答

梵蒂冈之花

在第一个示例中,通道将无法发送,因为无缓冲通道的另一端没有接收器。发送的将永远阻塞。因此等待组将永远等待。这是一个死锁情况,因为您的程序根本无法继续。在第二种情况下,同样的事情也会发生,但是你在一个单独的 goroutine 中等待。所以主函数能够继续。这不是一个完全的僵局。在这种情况下,继续意味着程序刚刚存在。

慕妹3146593

您的第一个示例启动了 3 个 goroutine,每个都尝试在c无缓冲通道上发送一个值。由于没有人从通道接收,所有这些都会阻塞。所以main()等待他们完成,也会被阻塞。所有 goroutine 都被阻塞:死锁。在您的第二个示例中,main()函数“只是”启动 goroutines,之后不做任何事情。当maingoroutine 完成时(当你的main()函数返回时),你的应用程序也会结束,它不会等待其他非maingoroutine 完成。有关详细信息,请参阅goroutine 无输出。
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go