假设我有这个:
go func() {
for range time.Tick(1 * time.Millisecond) {
a, b = b, a
}
}()
而在别处:
i := a // <-- Is this safe?
对于这个问题,与原始的 a
或 b
相比,i
的值是无关紧要的。唯一的问题是读取 a
是否安全。也就是说,a
可能是 nil
,部分赋值,无效,未定义,...... 除了一个有效值以外的任何东西吗?我已经尝试过使其失败,但到目前为止它总是成功的(在我的 Mac 上)。
我没有能够找到除了在The Go Memory Model文档中的这句话之外的任何具体信息:
这是否意味着单个机器字写入实际上是原子的?如果是这样,那么在 Go 中函数指针写入是单个机器字操作吗? 更新: 这里是正确同步的解决方案。Reads and writes of values larger than a single machine word behave as multiple machine-word-sized operations in an unspecified order.