读取操作是否保证读取某个作者在读取之前写入的值?
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 从未被程序的其他部分写入。
假设有一个名为 s
的变量由两个 go 例程 r1 和 r2 共享,r1(唯一的写入者)定期写入 s
,而 r2
定期阅读它。 r1先启动后r2.
如果s
不受任何类型的锁(包括通道)的保护,r2 是否可以看到任何不是由 r1 写入的随机值?
如果那会发生?请告诉我原因,谢谢!
它不会是“随机的”,但读取的实际值完全取决于它是什么类型、您的体系结构、编译器如何使用 re-ordered 语句以及时间。我们称之为 undefined,不是随机的。
整数等简单数据类型在大多数 架构上以原子方式读取。因此,如果 s
是一个简单的 uint32
,您 可能 没问题,这意味着值 可能 已写入由另一个 goroutine.
任何更复杂的东西(或在其他一些架构上)都会看到新旧价值的混合。对于其他数据类型(例如:切片、映射),实际数据可以重新分配到内存中的其他地方。结果是 mish-mash 从未被程序的其他部分写入。