登录
首页 >  Golang >  Go问答

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

来源:SegmentFault

时间:2023-02-24 18:50:13 482浏览 收藏

IT行业相对于一般传统行业,发展更新速度更快,一旦停止了学习,很快就会被行业所淘汰。所以我们需要踏踏实实的不断学习,精进自己的技术,尤其是初学者。今天golang学习网给大家整理了《golang死锁问题(fatal error: all goroutines are asleep - deadlock!)》,聊聊go,我们一起来看看吧!

问题内容

这段代码运行没有问题,循环输出:

call f1...

package main

import (
    "fmt"
)

func f1() {
    for {
        fmt.Println("call f1...")
    }
}

func f2() {
    fmt.Println("call f2...")
}

func main() {
    go f1()
    go f2()
    ch := make(chan int)
    

若注释掉

go f1()
,代码运行时提示死锁:

fatal error: all goroutines are asleep - deadlock!

代码如下:

package main

import (
    "fmt"
)

func f1() {
    for {
        fmt.Println("call f1...")
    }
}

func f2() {
    fmt.Println("call f2...")
}

func main() {
    // go f1()
    go f2()
    ch := make(chan int)
    

为什么同是调用协程,调用f1不会产生死锁,而调用f2会产生死锁。是因为f1有死循环么?按说没有协程往通道ch写,在main中读取ch应该都会产生死锁,是不是我理解错了,求解答。谢谢!

正确答案

已经提示很明确了,

all goroutines are asleep
,所有协程都在睡觉!
所以go就认为是死锁了。如果有
f1
的话,至少有一个协程是在干活的。

对于死锁的检测非常麻烦,或许go就采用了这种比较简单粗暴的方法。算是一个小bug吧,但是关系不大。

到这里,我们也就讲完了《golang死锁问题(fatal error: all goroutines are asleep - deadlock!)》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于golang的知识点!

声明:本文转载于:SegmentFault 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>
评论列表