【发布时间】:2016-07-23 07:57:35
【问题描述】:
我想知道对这句名言最接地气的解释是什么:
不要通过共享内存进行交流;通过通信共享内存。 (R.派克)
在The Go Memory Model我可以读到这个:
通道上的发送发生在该通道的相应接收完成之前。 (Golang 规范)
还有一个专门的golang article 解释报价。主要贡献是 working example 也是由 Andrew G 提供的。
嗯。有时谈论太多了....我从 Memory Spec 引文中得出,并且还通过查看工作示例得出:
在 goroutine1 通过通道向 goroutine2 发送(任何内容)后,goroutine1 所做的所有更改(内存中的任何位置)在通过同一通道接收后必须对 goroutine2 可见。 (我的 Golang 引理:)
因此,我得出这句名言的脚踏实地的解释:
要在两个 goroutine 之间同步内存访问,您不需要通过通道发送该内存。足够好是从频道接收(甚至什么都没有)。您将看到在发送时由 goroutine 发送(到通道)写入(任何地方)的任何更改。 (当然,假设没有其他 goroutine 正在写入相同的内存。)更新 (2) 8-26-2017
其实我有两个问题:
1) 我的结论正确吗?
2) 我的解释有帮助吗?
更新(1) 我假设 无缓冲频道。让我们先把自己限制在这一点上,以避免用太多的未知数来彻底检查自己。
请让我们也关注一个简单的用例,即两个 goroutine 通过单个通道进行通信以及相关的记忆效应,而不是最佳实践——这超出了这个问题的范围。
为了更好地理解我的问题的范围,假设 goroutine 可以访问任何类型的内存结构 - 不仅是原始的 - 它可以是一个大的,它可以是一个字符串、映射、数组等等。
【问题讨论】:
标签: go memory channel goroutine