Go语言Goroutine交替打印奇偶数字程序出现死锁问题
Go语言交替打印奇偶数字程序的死锁问题及解决
我正在学习Go语言,为了理解channel(通道)的工作机制,编写了一个由两个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 }
内容的提问来源于stack exchange,提问作者Technical Shil
相关产品推荐
相关产品推荐

