致命错误:所有goroutine都处于睡眠状态-死锁

时间:2018-07-10 05:33:27

标签: go goroutine

我有以下Go代码

ExampleDto[]

运行此代码时,出现错误致命错误:所有goroutine都在睡眠中-死锁!。但是,当我取消注释上方 Cheat 函数中的 go func()行时,错误消失了。我不明白为什么错误在第一种情况下会出现,为什么在使用goroutine时错误会消失。所以,如果有人可以解释一下呢?

1 个答案:

答案 0 :(得分:2)

在此简化示例中:

func Cheat(guess chan Choice) chan Choice {
        new_guess := make(chan Choice)
        new_guess <- Choice{}
        <-guess
        return new_guess
}

对新分配的通道进行写操作时,其他任何人都不可能拥有该通道,因此写操作将永远阻塞。由于该写块,从guess读取永远不会发生。但是,在您引用的代码中,Cheat()函数是唯一从guess通道读取的内容;因此,正在发生的读取操作会阻止正在写入的内容,直到对new_guess的写入操作才会发生读取操作,并且直到包含函数返回时才发生写入操作。

如果将通道I / O移至goroutine,则包含功能可以在事情进展之前返回,因此Cheat()中的写入与Game()结尾处的读取配对,并且事情可以向前发展。

相关问题