duanao6704 2012-09-13 01:51
浏览 28
已采纳

抛出:所有goroutine都在睡眠中-死锁

Given the following simple Go program

package main

import (
    "fmt"
)

func total(ch chan int) {
    res := 0
    for iter := range ch {
        res += iter
    }
    ch <- res
}

func main() {
    ch := make(chan int)
    go total(ch)
    ch <- 1
    ch <- 2
    ch <- 3
    fmt.Println("Total is ", <-ch)
}

I am wondering if someone can enlighten me as to why I get

throw: all goroutines are asleep - deadlock!

thank you

  • 写回答

2条回答 默认 最新

  • douniao7308 2012-09-13 06:45
    关注

    As you never close the ch channel, the range loop will never finish.

    You can't send back the result on the same channel. A solution is to use a different one.

    Your program could be adapted like this :

    package main
    
    import (
        "fmt"
    )
    
    func total(in chan int, out chan int) {
        res := 0
        for iter := range in {
            res += iter
        }
        out <- res // sends back the result
    }
    
    func main() {
        ch := make(chan int)
        rch  := make(chan int)
        go total(ch, rch)
        ch <- 1
        ch <- 2
        ch <- 3
        close (ch) // this will end the loop in the total function
        result := <- rch // waits for total to give the result
        fmt.Println("Total is ", result)
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 c程序不知道为什么得不到结果
  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置