1 回答

TA貢獻(xiàn)1780條經(jīng)驗(yàn) 獲得超1個贊
這兩個例子都不起作用。事實(shí)上,在任何傳統(tǒng)意義上的“工作”中,任何只發(fā)送到通道的示例都不會工作。
但是,為了清楚起見,這是每個步驟的步驟:
第一個例子
ch := make(chan int)
這將創(chuàng)建一個無緩沖通道。無緩沖通道不保存任何數(shù)據(jù),它們僅充當(dāng)通信管道——在程序執(zhí)行繼續(xù)之前,所有發(fā)送的數(shù)據(jù)都必須由其他東西接收——在通道的任一側(cè)。
ch <- 1
在這里,您在通道上發(fā)送數(shù)據(jù),但沒有等待接收它的東西,所以程序等待。在這種情況下,它會永遠(yuǎn)等待,因?yàn)槟鷱奈礊樵撏ǖ绖?chuàng)建接收器,因此您會陷入僵局。
第二個例子
c := make(chan int)
同樣,創(chuàng)建一個無緩沖通道。
go sum(s[:len(s)/2], c)
調(diào)用該sum
函數(shù),順便說一句,由于上述原因,該函數(shù)也將永遠(yuǎn)阻塞——通道上沒有接收任何東西,因此它將永遠(yuǎn)等待。但是,在這種情況下,您已經(jīng)在 goroutine 中調(diào)用了它。goroutine 將在單獨(dú)的執(zhí)行線程中運(yùn)行,而程序的其他部分運(yùn)行。雖然,由于從不從通道接收數(shù)據(jù),這個 goroutine 永遠(yuǎn)不會退出,直到主程序退出。
go sum(s[len(s)/2:], c)
再次,您sum
在 goroutine 中一次又一次地調(diào)用。所以在這一點(diǎn)上,你有三個 gorotuines:一個運(yùn)行main()
,一個運(yùn)行一個調(diào)用sum()
。后兩者永遠(yuǎn)不會退出。
然后你的程序退出。當(dāng)程序退出時,所有 goroutines(包括永遠(yuǎn)卡在你的頻道上的兩個)退出。
由于該程序立即退出,因此永遠(yuǎn)不會報告死鎖,但它確實(shí)存在,與您的第一個示例相同。
- 1 回答
- 0 關(guān)注
- 121 瀏覽
添加回答
舉報