账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    下面这行代码为何为死锁
    35
    0

    示例代码如下:

    package main
    import (
        "fmt"
        "sync"
    )
    func merge(cs ...<-chan int) <-chan int {
        var wg sync.WaitGroup
        out := make(chan int)
    
        // 为每一个输入channel cs 创建一个 goroutine output
        // output 将数据从 c 拷贝到 out,直到 c 关闭,然后 调用 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)
        }
    
        // 启动一个 goroutine,用于所有 output goroutine结束时,关闭 out
        // 该goroutine 必须在 wg.Add 之后启动
        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)
        }
    }
    

    不知为何会报all goroutines are asleep - deadlock!

    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部