在这个简单的C11程序中
#include <stdatomic.h>
int f(atomic_int* obj) {
return atomic_load(obj);
}
我希望生成的程序集将包含一个内存屏障。即使负载本身可能是原子的,CPU也会推测(即移动)在整个调用的调用方中对该内存位置的某些读取f
。但是,gcc -O
输出:
.file "repro.c"
.text
.globl f
.type f, @function
f:
.LFB0:
.cfi_startproc
movl (%rdi), %eax
ret
.cfi_endproc
.LFE0:
.size f, .-f
.ident "GCC: (GNU) 4.9.1"
.section .note.GNU-stack,"",@progbits
为什么这里不需要存储障碍?
英特尔文档说“读取不与其他读取重新排序”(第8.2.2节)
GCC仅mfence
在上生成指令atomic_store
。据我所知,这足以确保其他CPU看到的写入顺序与进行存储的CPU相同。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句