在golang中的缓冲通道上并发读取时发生冲突?

Bru*_*uce -1 channel go goroutine

我有一个缓冲的通道,可以通过多个(在此示例中为4)go例程读取。

queue := make(chan string, 10000) // a large buffered channel
Run Code Online (Sandbox Code Playgroud)

每个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
            }
         }
     }
  }
Run Code Online (Sandbox Code Playgroud)

多个go例程会在读取时发生冲突吗?换句话说,不同的go例程可以在通道中捕获相同的元素,还是一个go例程正在读取缓冲区,而另一个go例程已经读取并处理了某些元素?如何在阅读一个go例程的同时阻止其他go例程读取?

Kae*_*dys 7

简单的回答:不。放置在Go通道上的元素只能被读取一次,无论有多少goroutine试图同时读取该通道,并且无论通道是否被缓冲,该元素都适用。除非该元素多次发送到通道,否则不可能被两个不同的goroutine读取该元素。关于通道语义,缓冲所做的唯一一件事就是消除了读写同步发生的必要性。