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

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

為什么在全局范圍內(nèi)聲明通道會產(chǎn)生死鎖問題

為什么在全局范圍內(nèi)聲明通道會產(chǎn)生死鎖問題

Go
www說 2022-08-24 10:29:09
在3個代碼片段中,具有在本地范圍聲明的通道的代碼片段有效,其他代碼片段會產(chǎn)生死鎖問題,這里前面回答的SO問題之一說盡量避免在全局范圍內(nèi)聲明通道。我檢查了官方文檔,但我沒有找到任何解釋。為什么全局范圍通道在我沒有阻止通道發(fā)送和接收時出現(xiàn)錯誤?為什么我在這里遇到死鎖問題?在范圍和初始化方面與 Except 有何不同?make(chan int)var myChan chan int任何人都可以解釋和建議更好的文章/文檔/鏈接/ pdf,以有效地使用Go中的通道(并實現(xiàn)并發(fā))?(為簡潔起見,導(dǎo)入和“包主”從片段中省略)// 1. channel declared in global scopevar c chan intfunc main(){    go send()    fmt.Println(<-c)}func send(){    c <- 42}//output: fatal error: all goroutines are asleep - deadlock!// 2. channel declared in global scope + sending channel to goroutinevar c chan intfunc main(){    go send(c)    fmt.Println(<-c)}func send(c chan int){    c <- 42}//output: fatal error: all goroutines are asleep - deadlock!// 3. using channel as local scope and sharing it with goroutinefunc main(){    c := make(chan int)    go send(c)    fmt.Println(<-c)}func send(c chan int){    c <- 42}
查看完整描述

1 回答

?
倚天杖

TA貢獻(xiàn)1828條經(jīng)驗 獲得超3個贊

因為通過聲明一個未初始化的 ,其類型的零值,在 a 的情況下為 。var c chan intcchannil


如果實際運行代碼,錯誤消息將顯示此信息。兩個 goroutine 都在 chan 上發(fā)送/接收:nil


fatal error: all goroutines are asleep - deadlock!


goroutine 1 [chan receive (nil chan)]:

main.main()

    /tmp/sandbox288806111/prog.go:11 +0x5c


goroutine 18 [chan send (nil chan)]:

main.send()

    /tmp/sandbox288806111/prog.go:15 +0x39

created by main.main

    /tmp/sandbox288806111/prog.go:10 +0x39

相反,您正在顯式初始化變量 ,然后不是 。makecnil


這與全局范圍本身無關(guān)。事實上,如果你正確地初始化變量,例如,即使在全局范圍內(nèi),程序也不會死鎖。var c chan int = make(chan int)


其他讀物:通道公理(戴夫·切尼)


如果信道為零,則發(fā)送方和接收方?jīng)]有相互參照;它們都被阻止等待獨立頻道,并且永遠(yuǎn)不會取消阻止。


查看完整回答
反對 回復(fù) 2022-08-24
  • 1 回答
  • 0 關(guān)注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

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

公眾號

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