“交替打印奇数和偶数的 goroutine 陷入死锁”是一个在并发编程中常见的问题。在使用 goroutine 进行并发操作时,如果没有正确的同步机制,很容易导致死锁的情况发生。死锁是指两个或多个进程(或 goroutine)因为互相等待对方释放资源而无法继续执行的状态。本文将介绍这个问题的原因,并提供解决方案,帮助开发者更好地理解并发编程中的死锁问题。
我目前正在学习golang。我想检查 golang 通道是如何工作的。我创建了一个程序,其中两个 goroutine 将交替打印奇数和偶数。即使程序打印正确,但最后仍显示死锁错误。从错误消息中尚不清楚导致此问题的原因。
func main() { even := make(chan bool) odd := make(chan bool) go func() { defer close(odd) for i := 0; i <= 10; i += 2 { <-even print("even ====>") println(i) odd <- true } }() var wait sync.waitgroup wait.add(1) go func() { for i := 1; i <= 10; i += 2 { _, ok := <-odd if !ok { wait.done() return } print("odd ====>") println(i) even <- true } }() even <- true wait.wait() }
[编辑] 谢谢大家的回复。我编写了以下代码来解决该问题。
func main() { even := make(chan bool) odd := make(chan bool) done := make(chan bool) //var wait sync.WaitGroup //wait.Add(2) go func() { for i := 0; i <= 10; i += 2 { <-even print("Even ====>") println(i) odd <- true } close(odd) close(even) done <- true // wait.Done() }() go func() { for i := 1; ; i += 2 { _, ok := <-odd if !ok { //wait.Done() return } print("Odd ====>") println(i) select { case even <- true: case <-done: return } } }() even <- true //wait.Wait() <-done }
问题可以通过以下方式解决
select
ing 写入 even
时(第 28 行)以上是交替打印奇数和偶数的 goroutine 陷入死锁的详细内容。更多信息请关注PHP中文网其他相关文章!