【发布时间】:2023-03-17 22:01:01
【问题描述】:
我在想,如果多个 goroutine 在一组通道上执行 select 会发生什么情况,其中一个/一些通道在它们之间共享,并且在所有通道都在等待时,共享通道变为可用。
runtime 会处理这种情况并只允许一个 goroutine 访问通道并进行读/写吗?
【问题讨论】:
-
这就是渠道的意义所在。如果您不能同时使用它们,它们对于同步就没有多大用处。
-
使用它们进行同步与我在这里解释的场景不同。在我的场景中,两个 goroutine 尝试同时从同一个通道读取数据,通过运行
select主动等待。那么如果该通道有新数据,运行时是否只允许一个 goroutine 读取该数据? -
没有区别。通道是通信和同步原语,所有发送和接收都是同步点。
-
是的。请注意,您无法预测哪个 goroutine 将被解锁并继续。
-
这就是渠道的全部意义所在。多个 goroutine 可以安全地从同一个通道读取/写入。
标签: go concurrency