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

為了賬號安全,請及時綁定郵箱和手機立即綁定

運行 deadlock

package?main

import?(
???"fmt"
)

func?main()?{
???ch?:=?make(chan?string)
???for?i?:=?0;?i?<?5;?i++?{
??????go?printHello(i,?ch)
???}

???for?{
??????message?:=?<-ch
??????fmt.Println(message)
???}
}

func?printHello(i?int,?ch?chan?string)?{
???message?:=?fmt.Sprintf("groutine?%d?send?u?message",?i)
???fmt.Println(message)
???ch?<-?message
}

以上是我運行的代碼,執行結果:

fatal?error:?all?goroutines?are?asleep?-?deadlock!
groutine?4?send?u?message
groutine?4?send?u?message
goroutine?1?[chan?receive]:
groutine?1?send?u?message
main.main()
groutine?1?send?u?message
groutine?0?send?u?message
/Users/donng/go/src/practice/cmd/hello-world/main.go:14?+0x9e
groutine?2?send?u?message


正在回答

2 回答

經過測試找到問題了,原文中用

???for?{?????
????message?:=?<-ch??????
????fmt.Println(message)???
???}

這種寫法,在 for 循環到最后, ch 沒有數據時,程序死鎖。

1 回復 有任何疑惑可以回復我~

我將接收部分修改為以下,就可以了,不過很奇怪為什么老師的 5000 個,沒有出現死鎖。

go?func(ch?chan?string)?{
???for?{
??????message?:=?<-ch
??????fmt.Println(message)
???}
}(ch)


0 回復 有任何疑惑可以回復我~

舉報

0/150
提交
取消

運行 deadlock

我要回答 關注問題
微信客服

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

幫助反饋 APP下載

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

公眾號

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