- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
给定一个 C++ 代码片段:
int a = 0;
atomic<int> b{0};
Thread 1
a = 1;
b.store(1,memory_order_release);
Thread 2
while(!b.load(memory_order_acquire));
assert(a==1);
我们知道断言永远不会触发。
另一方面,golang atomic.Store使用隐含内存屏障的 xchg 指令,因此它可以产生与 c++11 一样的 memory_order_release 语义。
//go:noescape
func Store(ptr *uint32, val uint32)
TEXT runtime∕internal∕atomic·Store(SB), NOSPLIT, $0-12
MOVQ ptr+0(FP), BX
MOVL val+8(FP), AX
XCHGL AX, 0(BX)
RET
但是,执行atomic.Load是纯go代码,这意味着汇编时只需mov指令。
//go:nosplit
//go:noinline
func Load(ptr *uint32) uint32 {
return *ptr
}
那么,golangatomic.Load有获取语义吗?
如果它是如何工作的,如果不是,如何确保内存排序或使 a=1 可见?
最佳答案
在 x86/amd64 等强有序架构上,获取加载和释放存储只是常规加载和存储。为了使它们原子化,您需要确保内存与操作数大小对齐(Go 中自动对齐),并且编译器不会以不兼容的方式对它们重新排序,或者优化它们(例如,重用寄存器中的值)从内存中读取它。)
Go 原子 Load* 和 Store* 函数是顺序一致的。这是一种更强大的内存排序形式,即使在 x86/amd64 上也需要内存栅栏(或具有隐式内存栅栏的指令)。
引用rsc:
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.
关于c++ - golangatomic.Load 有获取语义吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55787091/
给定一个 C++ 代码片段: int a = 0; atomic b{0}; Thread 1 a = 1; b.store(1,memory_orde
我是一名优秀的程序员,十分优秀!