在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 問答/GO/ 下面這行代碼為何為死鎖

下面這行代碼為何為死鎖

示例代碼如下:

package main
import (
    "fmt"
    "sync"
)
func merge(cs ...<-chan int) <-chan int {
    var wg sync.WaitGroup
    out := make(chan int)

    // 為每一個(gè)輸入channel cs 創(chuàng)建一個(gè) goroutine output
    // output 將數(shù)據(jù)從 c 拷貝到 out,直到 c 關(guān)閉,然后 調(diào)用 wg.Done
    output := func(c <-chan int) {
        for n := range c {
            out <- n
        }
        wg.Done()
    }
    wg.Add(len(cs))
    for _, c := range cs {
        go output(c)
    }

    // 啟動(dòng)一個(gè) goroutine,用于所有 output goroutine結(jié)束時(shí),關(guān)閉 out
    // 該goroutine 必須在 wg.Add 之后啟動(dòng)
    go func() {
        wg.Wait()
        out <- 0
        close(out)
    }()
    return out
}

var ch1 chan int = make(chan int)
var ch2 chan int = make(chan int)
func fo(){
    for i := 0; i < 10; i++{
        if rand.Intn(2) == 0{
            ch1 <- 1
        }else{
            ch2 <- 2
        }
    }
}
func main(){
    go fo()
    for n := range merge(ch1, ch2){
        fmt.Println(n)
    }
}

不知為何會報(bào)all goroutines are asleep - deadlock!

回答
編輯回答
玩控

main 函數(shù)應(yīng)該這樣的

func main() {
    go func() {
        for n := range merge(ch1, ch2) {
            fmt.Println(n)
        }
    }()
    fo()
}

無緩沖的channel是阻塞的
當(dāng)在向一個(gè)無緩沖的channel發(fā)送數(shù)據(jù)時(shí),代碼會阻塞直到有另一個(gè)goroutine接收這個(gè)channel
所以改進(jìn)方法就是,先開啟一個(gè)goroutine來接收

2017年6月3日 02:27