【发布时间】:2021-01-21 17:45:01
【问题描述】:
我正在学习 goroutine 和通道,并且想知道如果多个 goroutine 尝试从同一个通道获取数据会发生什么。
go 运行时如何确保通道中被多个 goroutine 读取的数据仅提供给在通道上等待的一个 goroutine,而不是复制或发送到多个 goroutine。
当有多个 goroutine 试图从完全相同的通道中获取数据时,go 运行时是否会阻止竞争条件?对于哪些等待的 goroutine 获得数据,例如先来先服务,是否存在某种排序?
【问题讨论】:
-
永远不可能从一个通道中多次读取一个值(即使是多个 goroutines 也不行)。通道/运行时本身可以确保这一点。如何?为此,您必须深入研究 Go 中的实现方式。
-
感谢大家的意见。我真的很想知道使用哪种并发模型(使用锁或 CSP 同步)来防止从同一通道获取数据的多个 goroutine 的竞争条件。
-
@VipulKumar,CSP 是一个比用于实现它的概念更高级别的概念。 go memory 模型精确地描述了期望,但是 source 是 memory 模型如何实现的唯一参考。
标签: go concurrency