Go 中的死锁:“抛出:所有 goroutine 都在睡觉”
当所有正在运行的 goroutine 互相等待时,就会发生 goroutine 死锁完全的。在提供的 Go 代码中,由于 ch 通道未关闭,导致出现死锁。
total 函数使用范围循环不断等待 ch 通道上的新值。由于 ch 通道永远不会关闭,因此循环永远不会终止。这意味着负责执行该函数的 goroutine 永远不会完成。
同时,在 main 函数中,程序尝试将值发送到 ch 通道并接收结果。但是,由于总 goroutine 无限期地等待,因此它无法处理发送的值并发回结果。这会导致程序死锁。
要解决此死锁,必须在发送所有值后关闭 ch 通道。这将向 Total 函数发出信号,停止等待新值并计算结果。
这是带有通道关闭的代码的修改版本:
现在,goroutine 正在运行 Total将正确执行求和并将结果发送回 main,防止死锁。
以上是Go 死锁:如何避免'所有 goroutine 都在睡眠”错误?的详细内容。更多信息请关注PHP中文网其他相关文章!