作者热门文章
- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我知道在给定以下代码的情况下,g 会先打印 2 然后打印 0。
var a, b uint32
func f() {
a = 1
b = 2
}
func g() {
fmt.Println(b)
fmt.Println(a)
}
func main() {
go f()
g()
}
如果我把读写全部改成原子操作呢?是否保证如果 g 先打印 2,则也打印 1?
var a, b uint32
func f() {
atomic.StoreUint32(&a, 1)
atomic.StoreUint32(&b, 2)
}
func g() {
fmt.Println(atomic.LoadUint32(&b))
fmt.Println(atomic.LoadUint32(&a))
}
func main() {
go f()
g()
}
最佳答案
实际上它会像您描述的那样工作。 Go 编译器不会重新排序原子操作,原子存储是在 amd64 上使用 XCHG 实现的(以及其他架构上的类似指令):https://github.com/golang/go/blob/release-branch.go1.8/src/cmd/compile/internal/ssa/gen/AMD64.rules#L472
此行为目前未指定(从 Go 1.8 开始)并且可能会更改,请参阅 https://github.com/golang/go/issues/5045 中的讨论。了解更多信息。
关于memory - 原子操作是否建立了先行关系?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42231153/
上周在.NET性能优化群里面有一个很有意思的讨论,讨论的问题如下所示: 请教大佬:2D数组,用C#先遍历行再遍历列,或者先遍历列再遍历行,两种方式在性能上有区别吗? 据我所知,
访问链接树的所有节点的最佳方法是什么(所有节点都引用父节点和所有子节点,根节点的父节点为 null),以便在其任何祖先之前都不会访问任何节点?非递归的布朗尼点数。 最佳答案 伪代码: NodesToV
我是一名优秀的程序员,十分优秀!