Go – 解释:不要通过共享记忆来沟通;通过沟通分享记忆

我想知道这句名言最真实的解释是什么:

Don’t communicate by sharing memory; share memory by communicating. (R. Pike)

The Go Memory Model我可以读到这个:

A send on a channel happens before the corresponding receive from that channel completes. (Golang Spec)

还有专门的golang article解释报价.而关键贡献是working example也由Andrew G.

好.有时太多谈论….我已经从Memory Spec报价中得出,并且通过查看工作示例:

After a goroutine1 sends (anything) to a goroutine2 via a channel, then all changes (anywhere in the memory) done by goroutine1 must be visible to goroutine2 after it received via same channel. (Golang Lemma by Me:)

因此,我得出了名言的脚踏实地的解释:

To synchronize memory access between two goroutines, you don’t need to send that memory via channel. Good enough is to receive from the channel (even nothing). You will see any changes that were written (anywhere) by the goroutine sending (to the channel) at the time of it’s send. (Of course, assuming no other goroutines are writing to the same memory.) Update (2) 8-26-2017

我实际上有两个问题:

1)我的结论是否正确?

2)我的解释有帮助吗?

更新(1)
我假设没有缓冲的频道.让我们首先限制自己,避免用太多未知数来改造自己.

请注意,我们还要关注两个goroutine的简单用法,这两个goroutines通过单个通道和相关的记忆效应进行通信而不是最佳实践 – 这超出了本问题的范围.

为了更好地理解我的问题的范围,假设goroutine可以访问任何类型的内存结构 – 不仅是原始的 – 并且它可以是一个大的,它可以是字符串,映射,数组,等等.

实质上,是的.由于通道操作强制执行排序约束,因此在通道读取之后有资格观察在通道发送之前分配给变量的任何值.但重要的是要记住方程式的另一部分:如果要保证观察到这些值,则必须确保没有其他人可以在写入和读取之间写入这些变量.显然使用锁是可能的,但同时也没有意义,因为如果你已经将锁和跨线程内存修改结合在一起,你从通道获得了什么好处?你可以传递像布尔一样简单的东西作为允许独占访问全局数据的标记,并且就内存模型保证而言它是100%正确的(只要你的代码没有bug),它可能只是一个糟糕的设计,因为你会在没有充分理由的情况下将事情全部隐瞒并在远处行动.明确地传递数据通常会更清晰,更不容易出错.
https://stackoverflow.com/questions/36391421/explain-dont-communicate-by-sharing-memory-share-memory-by-communicating

转载注明原文:Go – 解释:不要通过共享记忆来沟通;通过沟通分享记忆