亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

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

goroutine 中的死鎖

goroutine 中的死鎖

Go
四季花海 2023-08-07 14:37:46
有人可以給我一些關于這段代碼的見解,為什么會出現死鎖錯誤for x:=range cfunc main() {    c:=make(chan int,10)    for i:=0;i<5;i++{        go func(chanel chan int,i int){            println("i",i)            chanel <- 1        }(c,i)    }    for x:=range c {        println(x)    }    println("Done!")}
查看完整描述

3 回答

?
30秒到達戰場

TA貢獻1828條經驗 獲得超6個贊

因為這:


    for x:=range c {

        println(x)

    }

將循環直到通道c關閉,這在這里從未完成。


這是修復此問題的一種方法,即使用 WaitGroup:


package main


import "sync"


func main() {

    var wg sync.WaitGroup

    c := make(chan int, 10)


    for i := 0; i < 5; i++ {

        wg.Add(1)

        go func(chanel chan int, i int) {

            defer wg.Done()

            println("i", i)

            chanel <- 1

        }(c, i)

    }


    go func() {

        wg.Wait()

        close(c)

    }()


    for x := range c {

        println(x)

    }

    println("Done!")

}

在 Go Playground 上嘗試一下


查看完整回答
反對 回復 2023-08-07
?
瀟湘沐

TA貢獻1816條經驗 獲得超6個贊

您創建五個 goroutine,每個 goroutine 向通道發送一個整數值。一旦所有這五個值都被寫入,就沒有其他 goroutine 寫入通道了。

主 goroutine 從通道讀取這五個值。但是沒有任何 goroutine 可以寫入第六個值或關閉通道。因此,您在等待來自通道的數據時陷入僵局。

所有寫入完成后關閉通道。弄清楚如何使用這段代碼來做到這一點應該是一個有趣的練習。


查看完整回答
反對 回復 2023-08-07
?
GCT1015

TA貢獻1827條經驗 獲得超4個贊

需要關閉通道以指示任務已完成。


與a協調sync.WaitGroup:


c := make(chan int, 10)


var wg sync.WaitGroup // here


for i := 0; i < 5; i++ {


    wg.Add(1) // here


    go func(chanel chan int, i int) {

        defer wg.Done()

        println("i", i)

        chanel <- 1

    }(c, i)

}


go func() {

    wg.Wait() // and here

    close(c)

}()


for x := range c {

    println(x)

}

println("Done!")

https://play.golang.org/p/VWcBC2YGLvM


查看完整回答
反對 回復 2023-08-07
  • 3 回答
  • 0 關注
  • 183 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號