登录
首页 >  Golang >  Go问答

可以在多个 goroutine 中安全地使用 select 关闭通道吗?

来源:stackoverflow

时间:2024-03-04 14:06:25 427浏览 收藏

编程并不是一个机械性的工作,而是需要有思考,有创新的工作,语法是固定的,但解决问题的思路则是依靠人的思维,这就需要我们坚持学习和更新自己的知识。今天golang学习网就整理分享《可以在多个 goroutine 中安全地使用 select 关闭通道吗?》,文章讲解的知识点主要包括,如果你对Golang方面的知识点感兴趣,就不要错过golang学习网,在这可以对大家的知识积累有所帮助,助力开发能力的提升。

问题内容

我的解决方案如下,但是以下代码中是否存在竞争条件(它会出现恐慌)吗?

c := make(chan struct{})

for i := 0; i < 1000000; i++ {
    go func() {
        select {
        case <-c:
        default:
            close(c)
        }
    }()
}

我认为是的,但是 go test -race 没有检测到它,并且根据经验,我无法让它恐慌。


正确答案


您在没有同步的情况下启动了多个 goroutine。所以它们同时运行。可能会发生其中两个并行评估 <-c 的情况,因为这是一个阻塞操作,因此两者都会选择 default 情况。此时,这两个 goroutine 都会尝试关闭通道,只有其中一个会成功,另一个会发生恐慌:你无法关闭已关闭的通道。

这不是竞争条件,因为您不会同时读取/修改变量,但尝试关闭关闭的通道会导致运行时恐慌(因此竞争检测器永远不会捕获此情况)。

当一个通道上有多个 Goroutine 发送数据时,等待所有 Goroutine 完成,然后关闭单个 Goroutine 中的通道。不要尝试从多个 goroutine 中关闭通道。

今天关于《可以在多个 goroutine 中安全地使用 select 关闭通道吗?》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>