写入两个独立的通道是否可靠地顺序进行?
Is writing to two separate channels reliably sequential?
如果我在两个频道上有 select:
for {
select {
case <-chan1:
// do something
case <-chan2:
// do something else
}
}
在一个单独的 goroutine 中,我按顺序写入这些通道:
chan1 <- "blah"
chan2 <- true
我能保证在 "do something else" 之前看到 "do something" 执行吗?
我知道 select 如果它有两个未阻塞的通道,它会随机选择,但我认为如果 select 是,写入第一个通道可能可靠地 "interrupt" 写入 goroutine已经阻塞,这意味着 select 将在第二次写入之前在未阻塞的第一个通道上 运行。
是的,如果通道是无缓冲的,您可以依赖它。见 Go Memory Model.
如果我在两个频道上有 select:
for {
select {
case <-chan1:
// do something
case <-chan2:
// do something else
}
}
在一个单独的 goroutine 中,我按顺序写入这些通道:
chan1 <- "blah"
chan2 <- true
我能保证在 "do something else" 之前看到 "do something" 执行吗?
我知道 select 如果它有两个未阻塞的通道,它会随机选择,但我认为如果 select 是,写入第一个通道可能可靠地 "interrupt" 写入 goroutine已经阻塞,这意味着 select 将在第二次写入之前在未阻塞的第一个通道上 运行。
是的,如果通道是无缓冲的,您可以依赖它。见 Go Memory Model.