交替打印奇数和偶数的 goroutine 陷入死锁
短信预约 -IT技能 免费直播动态提醒
“交替打印奇数和偶数的 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
}
解决方法
问题可以通过以下方式解决
- 删除第二个 gofunc 的 for 上限(第 20 行)
-
select
ing 写入even
时(第 28 行)
以上就是交替打印奇数和偶数的 goroutine 陷入死锁的详细内容,更多请关注编程网其它相关文章!
免责声明:
① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。
② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341