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

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

僅向通道發(fā)送值時進(jìn)入工作流程

僅向通道發(fā)送值時進(jìn)入工作流程

Go
有只小跳蛙 2023-06-19 15:49:20
當(dāng)我只向通道發(fā)送值時,它會出錯。這是示例代碼。package mainimport "fmt"func main() {? ch := make(chan int)? ch <- 1? fmt.Println("Does not work")}在這里,我只是向通道發(fā)送值但沒有收到任何東西。它給出一個錯誤fatal error: all goroutines are asleep - deadlock!?但是當(dāng)我運(yùn)行以下代碼時,它不會給出任何錯誤package mainimport "fmt"func sum(s []int, c chan int) {? ? sum := 0? ? for _, v := range s {? ? ? ? sum += v? ? }? ? c <- sum // send sum to c}func main() {? ? s := []int{7, 2, 8, -9, 4, 0}? ? c := make(chan int)? ? go sum(s[:len(s)/2], c)? ? go sum(s[len(s)/2:], c)? ? fmt.Println("did not receive but still works")}并打印did not receive but still works我不明白為什么它在第二種情況下有效,而在第一種情況下卻不起作用。即使在這兩種情況下我都沒有收到任何關(guān)于頻道的價值。還有是什么導(dǎo)致了第一種情況下的死鎖以及如何在第二種情況下避免死鎖?
查看完整描述

1 回答

?
慕神8447489

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í)存在,與您的第一個示例相同。


查看完整回答
反對 回復(fù) 2023-06-19
  • 1 回答
  • 0 關(guān)注
  • 121 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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