為什么這是示例 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)) }()}
2 回答

梵蒂岡之花
TA貢獻1900條經驗 獲得超5個贊
在第一個示例中,通道將無法發送,因為無緩沖通道的另一端沒有接收器。發送的將永遠阻塞。因此等待組將永遠等待。這是一個死鎖情況,因為您的程序根本無法繼續。
在第二種情況下,同樣的事情也會發生,但是你在一個單獨的 goroutine 中等待。所以主函數能夠繼續。這不是一個完全的僵局。在這種情況下,繼續意味著程序剛剛存在。

慕妹3146593
TA貢獻1820條經驗 獲得超9個贊
您的第一個示例啟動了 3 個 goroutine,每個都嘗試在c
無緩沖通道上發送一個值。由于沒有人從通道接收,所有這些都會阻塞。所以main()
等待他們完成,也會被阻塞。所有 goroutine 都被阻塞:死鎖。
在您的第二個示例中,main()
函數“只是”啟動 goroutines,之后不做任何事情。當main
goroutine 完成時(當你的main()
函數返回時),你的應用程序也會結束,它不會等待其他非main
goroutine 完成。有關詳細信息,請參閱goroutine 無輸出。
- 2 回答
- 0 關注
- 119 瀏覽
添加回答
舉報
0/150
提交
取消