为什么GCC会在C11 atomic_load中忽略内存障碍?

时间:2014-07-22 13:04:04

标签: c gcc

在这个简单的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

为什么这里不需要记忆障碍?

1 个答案:

答案 0 :(得分:1)

英特尔文档说"Reads are not reordered with other reads" (section 8.2.2)

GCC仅在mfence上生成atomic_store指令。至于我可以绕过它,这应该足以确保其他CPU看到的写入顺序与执行存储的CPU上的写入顺序相同。