golang死锁问题(fatal error: all goroutines are asleep - deadlock!)

发布于 2022-09-12 23:47:08 字数 1167 浏览 48 评论 0

package main

import (
    "fmt"
    _"time"
)

var (
    foo6Chan = make(chan int, 10)
)

func foo6() {
    for val := range foo6Chan {
        go func() {
            fmt.Printf("foo6 val = %d\n", val)
        }()
    }
}

func main() {
    foo6Chan <- 1
    foo6Chan <- 2
    foo6Chan <- 3
    foo6Chan <- 5
    foo6()
    //time.Sleep(2 * time.Second)
}

执行报错

foo6 val = 5
foo6 val = 5
foo6 val = 5
foo6 val = 5
fatal error: all goroutines are asleep - deadlock!

goroutine 1 [chan receive]:
main.foo6()
    /Users/plsof/4.go:13 +0x94
main.main()
    /Users/plsof/4.go:25 +0x96
exit status 2

如果我把foo6() 改为 go foo6() 执行ok

package main

import (
    "fmt"
    "time"
)

var (
    foo6Chan = make(chan int, 10)
)

func foo6() {
    for val := range foo6Chan {
        go func() {
            fmt.Printf("foo6 val = %d\n", val)
        }()
    }
}

func main() {
    foo6Chan <- 1
    foo6Chan <- 2
    foo6Chan <- 3
    foo6Chan <- 5
    go foo6()
    time.Sleep(2 * time.Second)
}

想请教一下这个是怎么回事了

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

猫瑾少女 2022-09-19 23:47:08

报错是因为没有关闭foo6Chan这个channel,会一直阻塞在for循环。

解决:

...
foo6Chan <- 5
close(foo6Chan) // 关闭channle
foo6()

添加go关键字不报错是因为在另一个线程中阻塞了,2秒后主函数结束会杀掉线程。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文