go - Go 中的原子操作是否确保其他变量对其他线程可见?
问题描述
这让我很困惑,我正在阅读 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 中没有得到很好的定义,所以为了超级安全,你不应该假设任何东西,即对 的更改a
是不可见的。但在实践中,据我所知,所有架构都会做一个内存围栏,所以你很安全。
关于定义行为有一个大问题, Russ Cox 有评论说
是的,我在去年冬天花了一段时间,但还没有机会把它写好。简短的版本是我相当确定规则将是 Go 的原子保证原子变量之间的顺序一致性(行为类似于 C/C++ 的 seqconst 原子),并且您不应该混合给定的原子和非原子访问记忆词。
推荐阅读
- python - 表单保存未将用户添加到模型
- sql - 使用 SQL 计算 SO Reputation 的 CDF
- node.js - 按名称及其属性刮取元素,然后打印它们 - Puppeteer
- twilio - 如何振铃 Twilio SIP 域中的每个用户
- swift - 无法从 UDP 请求中获得响应
- testing - 图像/绘图像素比较工具
- javascript - 如何让命令关闭不和谐机器人?(使用 Javascript、Node.js 和 Discord.js)
- tensorflow - Tensorflow 对象检测:int() 参数必须是字符串、类似字节的对象或数字,而不是“张量”
- ios - AVFoundation - 录制的混合合成视频的第一帧是黑色的
- c++ - Arduino DigiSpark NeoPixel 蓝牙 C++ 缓冲区溢出