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

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

為什么我的 go 程序會出現(xiàn)死鎖?

為什么我的 go 程序會出現(xiàn)死鎖?

Go
動漫人物 2022-01-10 14:58:17
我對 golang 編程很陌生,我有以下程序產(chǎn)生deadlock,我不明白為什么?另一件事是如果我在doAdd方法中關(guān)閉通道然后我進入一個無限循環(huán),這對我來說也有點奇怪。這是程序。var wg sync.WaitGroupfunc main() {    ch1 := make(chan string)    ch2 := make(chan string)    ch3 := make(chan string)    chClose := make(chan bool)    wg.Add(3)    go doAdd(ch1, "ch1")    go doAdd(ch2, "ch2")    go doAdd(ch3, "ch3")    go waitForClose(chClose)    for {        select {        case x := <-ch1:            fmt.Println("Got from ch1 ", x)        case y := <-ch2:            fmt.Println("Got from ch2 ", y)        case z := <-ch3:            fmt.Println("Got from ch3 ", z)        case <-chClose:            fmt.Println("CLOSED")            break        }    }}func waitForClose(chClose chan bool) {    wg.Wait()    chClose <- true}func doAdd(ch chan string, name string) {    for i := 0; i < 10; i++ {        ch <- strconv.Itoa(i)    }    wg.Done()}輸出是:Got from ch1  0Got from ch1  1Got from ch1  2Got from ch1  3Got from ch1  4Got from ch1  5Got from ch1  6Got from ch1  7Got from ch1  8Got from ch1  9Got from ch2  0Got from ch2  1Got from ch2  2Got from ch2  3Got from ch2  4Got from ch2  5Got from ch2  6Got from ch2  7Got from ch2  8Got from ch2  9Got from ch3  0Got from ch3  1Got from ch3  2Got from ch3  3Got from ch3  4Got from ch3  5Got from ch3  6Got from ch3  7Got from ch3  8Got from ch3  9CLOSEDfatal error: all goroutines are asleep - deadlock!goroutine 1 [select]:main.main()        c:/PraveenData/demo/go-work/main.go:29 +0x915exit status 2
查看完整描述

2 回答

?
喵喔喔

TA貢獻1735條經(jīng)驗 獲得超5個贊

你遇到死鎖的原因是break你select唯一的內(nèi)部打破了select,讓for循環(huán)自由地重新進入選擇,沒有一個通道準(zhǔn)備好從中讀取。


您可以通過執(zhí)行以下操作來挽救它:


done := false


for !done {

        select {

               ...

        case <-chClose:

                done = true

                fmt.Println("CLOSED")

        }

}

這很for容易讓循環(huán)終止。


另一種是使用標(biāo)簽:


OuterLoop:

        for {

                select {

                ...

                case <-chClose:

                        fmt.Println("CLOSED")

                        break OuterLoop

                }

        }

在這種情況下,我個人對第一個版本有一點偏好,但這只是個人喜好問題。


查看完整回答
反對 回復(fù) 2022-01-10
?
呼如林

TA貢獻1798條經(jīng)驗 獲得超3個贊

break在你的程序結(jié)束時只打破select(并再次進入循環(huán),因此陷入僵局):用return工作正常替換它:https : //play.golang.org/p/j5bDaj3z7y

事實上,從規(guī)格

“break”語句會終止同一個函數(shù)中最里面的“for”、“switch”或“select”語句的執(zhí)行。

您可以通過return(如我所做的)、goto 或其他一些架構(gòu)重構(gòu)來解決這個問題。

至于無限循環(huán),也是同樣的問題,而不是封閉通道總是返回,所以當(dāng)break退出 時select,你進入循環(huán),并nil永遠(yuǎn)從封閉通道接收s


查看完整回答
反對 回復(fù) 2022-01-10
  • 2 回答
  • 0 關(guān)注
  • 214 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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