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 Llama如何调用shell或者Python
  • ¥20 谁能帮我挨个解读这个php语言编的代码什么意思?
  • ¥15 win10权限管理,限制普通用户使用删除功能
  • ¥15 minnio内存占用过大,内存没被回收(Windows环境)
  • ¥65 抖音咸鱼付款链接转码支付宝
  • ¥15 ubuntu22.04上安装ursim-3.15.8.106339遇到的问题
  • ¥15 blast算法(相关搜索:数据库)
  • ¥15 请问有人会紧聚焦相关的matlab知识嘛?
  • ¥15 网络通信安全解决方案
  • ¥50 yalmip+Gurobi