【问题标题】:Concurrent selects over same shared channel在同一个共享通道上并发选择
【发布时间】:2023-03-17 22:01:01
【问题描述】:

我在想,如果多个 goroutine 在一组通道上执行 select 会发生什么情况,其中一个/一些通道在它们之间共享,并且在所有通道都在等待时,共享通道变为可用。

runtime 会处理这种情况并只允许一个 goroutine 访问通道并进行读/写吗?

【问题讨论】:

  • 这就是渠道的意义所在。如果您不能同时使用它们,它们对于同步就没有多大用处。
  • 使用它们进行同步与我在这里解释的场景不同。在我的场景中,两个 goroutine 尝试同时从同一个通道读取数据,通过运行 select 主动等待。那么如果该通道有新数据,运行时是否只允许一个 goroutine 读取该数据?
  • 没有区别。通道是通信同步原语,所有发送和接收都是同步点。
  • 是的。请注意,您无法预测哪个 goroutine 将被解锁并继续。
  • 这就是渠道的全部意义所在。多个 goroutine 可以安全地从同一个通道读取/写入。

标签: go concurrency


【解决方案1】:

首先是cmets回答它。您也可以编写一些代码并亲自查看。这些线路上的东西https://play.golang.org/p/4ZQLwO9wvw

【讨论】:

    猜你喜欢
    • 2011-02-03
    • 2021-09-27
    • 2013-09-28
    • 1970-01-01
    • 2022-01-22
    • 2021-09-13
    • 1970-01-01
    • 2016-12-30
    • 1970-01-01
    相关资源
    最近更新 更多