总结
豆包 AI 助手文章总结
首页 > 后端开发 > Golang > 正文

交替打印奇数和偶数的 goroutine 陷入死锁

王林
发布: 2024-02-13 16:00:10
转载
1260人浏览过

交替打印奇数和偶数的 goroutine 陷入死锁

“交替打印奇数和偶数的 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
}
登录后复制

解决方法

问题可以通过以下方式解决

  1. 删除第二个 gofunc 的 for 上限(第 20 行)
  2. selecting 写入 even 时(第 28 行)

以上就是交替打印奇数和偶数的 goroutine 陷入死锁的详细内容,更多请关注php中文网其它相关文章!

全能打印神器
全能打印神器

全能打印神器是一款非常好用的打印软件,可以在电脑、手机、平板电脑等设备上使用。支持无线打印和云打印,操作非常简单,使用起来也非常方便,有需要的小伙伴快来保存下载体验吧!

下载
相关标签:
来源:stackoverflow网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号