读取操作是否保证读取某个作者在读取之前写入的值?

Is a read operation guaranteed to read a value which some writer wrote it before the read?

假设有一个名为 s 的变量由两个 go 例程 r1 和 r2 共享,r1(唯一的写入者)定期写入 s,而 r2 定期阅读它。 r1先启动后r2.

如果s不受任何类型的锁(包括通道)的保护,r2 是否可以看到任何不是由 r1 写入的随机值? 如果那会发生?请告诉我原因,谢谢!

它不会是“随机的”,但读取的实际值完全取决于它是什么类型、您的体系结构、编译器如何使用 re-ordered 语句以及时间。我们称之为 undefined,不是随机的。

整数等简单数据类型在大多数 架构上以原子方式读取。因此,如果 s 是一个简单的 uint32,您 可能 没问题,这意味着值 可能 已写入由另一个 goroutine.

任何更复杂的东西(或在其他一些架构上)都会看到新旧价值的混合。对于其他数据类型(例如:切片、映射),实际数据可以重新分配到内存中的其他地方。结果是 mish-mash 从未被程序的其他部分写入。