亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

與 GO 等待組同步

與 GO 等待組同步

Go
森欄 2022-11-08 10:40:42
為什么這是示例 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 中等待。所以主函數能夠繼續。這不是一個完全的僵局。在這種情況下,繼續意味著程序剛剛存在。


查看完整回答
反對 回復 2022-11-08
?
慕妹3146593

TA貢獻1820條經驗 獲得超9個贊

您的第一個示例啟動了 3 個 goroutine,每個都嘗試在c無緩沖通道上發送一個值。由于沒有人從通道接收,所有這些都會阻塞。所以main()等待他們完成,也會被阻塞。所有 goroutine 都被阻塞:死鎖。

在您的第二個示例中,main()函數“只是”啟動 goroutines,之后不做任何事情。當maingoroutine 完成時(當你的main()函數返回時),你的應用程序也會結束,它不會等待其他非maingoroutine 完成。有關詳細信息,請參閱goroutine 無輸出。


查看完整回答
反對 回復 2022-11-08
  • 2 回答
  • 0 關注
  • 119 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號