gpt4 book ai didi

go - Go 中的原子操作是否确保其他变量对其他线程可见?

转载 作者:行者123 更新时间:2023-12-03 18:52:13 25 4
gpt4 key购买 nike

这让我很困惑,我正在阅读 golang 内存模型,https://golang.org/ref/mem

var l sync.Mutex
var a string

func f() {
a = "hello, world"
l.Unlock()
}

func main() {
l.Lock()
go f()
l.Lock()
print(a)
}
互斥锁通过原子解锁
UnLock: new := atomic.AddInt32(&m.state, -mutexLocked)

Lock: atomic.CompareAndSwapInt32(&m.state, 0, mutexLocked)
我的问题是,如果原子 AddInt32,CompareAndSwapInt32 会导致内存障碍,如果 a将在不同的 goroutine 中可见。
在 Java 中,我知道 AtomicInteger,“volatile”的内存屏障,保持线程字段可见。

最佳答案

Go 没有 volatile 等价物。 Go 中没有很好地定义原子内存模型,所以为了 super 安全,你应该什么都不做,即更改为 a可以隐形。但实际上,据我所知,所有架构都会做一个内存栅栏,所以你是安全的。
有一个 big issue关于定义行为,有一个 comment from Russ Cox

Yes, I spent a while on this last winter but didn't get a chance to write it up properly yet. The short version is that I'm fairly certain the rules will be that Go's atomics guarantee sequential consistency among the atomic variables (behave like C/C++'s seqconst atomics), and that you shouldn't mix atomic and non-atomic accesses for a given memory word.


相关回答 https://stackoverflow.com/a/58892365/2133484

关于go - Go 中的原子操作是否确保其他变量对其他线程可见?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66759905/

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