gpt4 book ai didi

memory - 原子操作是否建立了先行关系?

转载 作者:IT王子 更新时间:2023-10-29 01:27:27 27 4
gpt4 key购买 nike

我知道在给定以下代码的情况下,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/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com