第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么這個(gè) goroutine 會(huì)泄漏?

為什么這個(gè) goroutine 會(huì)泄漏?

Go
幕布斯7119047 2023-07-10 10:50:28
我正在閱讀“Go 中的并發(fā)”,并發(fā)現(xiàn)了這個(gè) goroutine 泄漏的示例:func main() {    var wg sync.WaitGroup    doWork := func(strings <-chan string) <-chan interface{} {        completed := make(chan interface{})        go func() {            defer fmt.Println("doWork exited.")            defer close(completed)            defer wg.Done()            fmt.Println("a")            for s := range strings {                fmt.Println(s)            }            fmt.Println("b")        }()        return completed    }    wg.Add(1)    doWork(nil)    fmt.Println("Waiting")    wg.Wait()    fmt.Println("Done.")}通道strings永遠(yuǎn)不會(huì)寫(xiě)入任何字符串,并且包含的 goroutinedoWork將在進(jìn)程的生命周期內(nèi)保留在內(nèi)存中。我不明白 - 為什么?我如何理解這段代碼:原樣-loop 剛剛strings被nil range跳過(guò)。當(dāng)任何范圍超過(guò)nil:slice := []int{10, 20, 30, 40, 50}slice = nilfor i := range slice {   fmt.Println(i)}fmt.Println("Done")fmt.Println("doWork exited.")將被處決close(completed)將被處決但我看到它是這樣工作的。為什么 ?
查看完整描述

1 回答

?
慕斯王

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超2個(gè)贊

由于字符串為零,因此范圍循環(huán)被跳過(guò)。

這個(gè)假設(shè)是不正確的。在 Go 中,從nil通道讀取總是會(huì)阻塞。這是在語(yǔ)言規(guī)范中定義的(感謝 @peterSO 挖掘出鏈接):

從零通道接收永遠(yuǎn)阻塞。

無(wú)論如何,這種行為可以很容易地用一個(gè)最小的例子來(lái)重現(xiàn):

func?main()?{?
???var?s?chan?string
????<-?s
}

這個(gè)程序永遠(yuǎn)不會(huì)完成(在操場(chǎng)上,它會(huì)崩潰all goroutines are asleep - deadlock)。

因?yàn)閺?nil 通道讀取(在您的示例中為strings)將永遠(yuǎn)阻塞(因?yàn)闊o(wú)法將任何內(nèi)容寫(xiě)入 nil 通道),所以 goroutinedoWork將永遠(yuǎn)不會(huì)完成,因此會(huì)發(fā)生泄漏。


查看完整回答
反對(duì) 回復(fù) 2023-07-10
  • 1 回答
  • 0 關(guān)注
  • 147 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)