【问题标题】:Is writing to two separate channels reliably sequential?写入两个单独的通道是否可靠地顺序?
【发布时间】:2019-07-04 14:33:21
【问题描述】:

如果我在两个频道上有一个选择:

for {
    select {
    case <-chan1:
        // do something
    case <-chan2:
        // do something else
    }
}

在一个单独的 goroutine 中,我按顺序写入这些通道:

chan1 <- "blah"
chan2 <- true

我能保证在“做其他事情”之前看到“做某事”吗?

我知道如果 select 有两个未阻塞的通道,它会随机选择,但我认为如果 select 已经阻塞,写入第一个通道可能会可靠地“中断”写入 goroutine,这意味着 select 将在未阻塞的通道上运行第二次写入之前的第一个通道。

【问题讨论】:

  • 个别频道已订购。您必须自己安排任何其他排序。
  • 大概那个 select 语句处于某种循环中?否则只有第一种情况继续进行(然后发送方在第二次发送时永远阻塞)。
  • @Peter 是的,这是一个循环,对不起,我从问题中省略了太多。

标签: go channel goroutine


【解决方案1】:

是的,如果通道没有缓冲,您可以依赖它。请参阅Go Memory Model

【讨论】:

    猜你喜欢
    • 2021-11-26
    • 2020-01-02
    • 2021-03-25
    • 1970-01-01
    • 2017-02-01
    • 2019-07-31
    • 2015-05-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多