GoLang 中的死锁:为什么要在缓冲通道上进行范围?
在 GoLang 中使用缓冲通道时,避免造成死锁情况非常重要。最近的一个问题引起了人们的担忧,即在所有 goroutine 完成后尝试在缓冲通道上进行范围操作时遇到死锁。
提供的代码尝试使用容量为 4 的缓冲通道并生成 4 个发送数据的 goroutine到频道。然而,出现死锁的原因是:
解决方案 1:扩展通道大小并在完成后关闭
要解决死锁,通道可以增加大小并在所有 goroutine 完成后关闭:
ch := make(chan []int, 5)
...
wg.Wait()
close(ch)
但是,这消除了流水线的好处,因为它会阻止打印,直到所有任务完成。
解决方案 2:从打印例程中发出信号完成
要启用实际的流水线操作,可以在打印例程中调用 Done() 函数:
func main() {
ch := make(chan []int, 4)
...
go func() {
for c := range ch {
fmt.Printf("c is %v\n", c)
wg.Done()
}
}()
...
}
这种方法确保仅在打印每个元素后调用 Done() 函数,有效地表示每个 goroutine 的完成。
免责声明: 提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发到邮箱:[email protected] 我们会第一时间内为您处理。
Copyright© 2022 湘ICP备2022001581号-3