我想知道对这句名言最实事求是的解释是什么:
不要通过共享记忆来交流,要通过交流来分享记忆.(R.派克)
在The Go Memory Model分钟里,我可以读到这个:
通道上的发送发生在来自该通道的相应接收完成之前.(Golang Spec)
还有一个专门的golang article解释这句话.关键贡献也是由安德鲁·G.
井.有时候说得太多了……我从Memory Spec报价中推导出以下内容,并通过查看工作示例得出以下结论:
goroutine1通过通道向goroutine2发送(任何内容)后,goroutine1所做的所有更改(内存中的任何位置)必须在goroutine2通过同一通道接收后可见.(我的Golang引理:)
因此,我得出了对这句名言的实事求是的解释:
要在两个Goroutine之间进行同步内存访问,您不需要通过通道发送该内存.足够好的是从通道接收(甚至什么都没有).在发送时,您将看到Goroutine发送(到通道)时(在任何位置)写入的任何更改.(当然,假设没有其他Goroutine正在写入相同的内存.)Update (2) 8-26-2017
我实际上有两个问题:
1) Is my conclusion correct?个
2) Does my explanation help?个
Update (1)个 我想是unbuffered channels吧.让我们先把自己限制在这一点上,以避免用太多的未知因素来彻底 retrofit 我们自己.
请让我们也关注一个简单的用例,两个Goroutine通过一个通道进行通信,以及相关的记忆效应,而不是最佳实践——这超出了本问题的范围.
为了更好地理解我的问题的范围,假设goroutine可以访问任何类型的内存 struct -不仅仅是primitve内存 struct -它可以是很大的内存 struct ,可以是字符串、映射、数组等等.