【发布时间】:2017-07-22 19:26:39
【问题描述】:
我有一个被多个(本例中为 4 个)go 例程读取的缓冲通道。
queue := make(chan string, 10000) // a large buffered channel
每个 go 例程检查通道中可用元素的数量并处理它们。
for i :=0; i< 4; i++{ // spun 4 go routines
go func() {
for {
for elem := range queue {
// do something with the elem from the channel
}
}
}
}
多个 go 例程会在读取时发生冲突吗?换句话说,不同的 goroutine 是否可以在通道中获取相同的元素,或者当一个 goroutine 正在读取缓冲区时,其他 goroutine 已经读取并处理了一些元素?如何在一个 go 例程正在读取时阻止其他 go 例程读取?
【问题讨论】:
-
在比赛检测器下尝试这个会告诉你更多。请注意,通道的整个想法是在不同的 goroutine 之间提供同步,那么您期望什么?阅读语言规范后,您会期待什么?
-
规范明确指出它会阻塞非缓冲读取,但对于缓冲通道的读取则不明确。不必显式使用互斥锁来进行一致的读取会很好。
-
缓冲情况下的规范也很清楚:如果值可用,则读取成功。