为什么 glibc 中 x86 的读写屏障不使用 __volatile asm?

Why do read and write barrier for x86 in glibc not use __volatile asm?

我正在研究glibc(版本是2.32)。至于memory barrier, read, write and full barrier for x86 如下:

#define atomic_full_barrier() \
    __asm __volatile (LOCK_PREFIX "orl [=11=], (%%" SP_REG ")" ::: "memory")
#define atomic_read_barrier() __asm ("" ::: "memory")
#define atomic_write_barrier() __asm ("" ::: "memory")

正如cppreference and this answer所说,volatile 告诉编译器不要优化和重新排序这条指令。

为什么write和read barrier不用__asm __volatile,而full barrier用了?

没有输出操作数的 asm 语句隐式为 volatile (GCC manual).
所以它们实际上都是 volatile,这是它们不被优化器删除所必需的。

(non-volatile asm 被假定为没有副作用的纯函数,运行 仅在需要产生输出时才被破坏。只有当优化器决定时/当优化器决定它需要 运行 asm 语句)。

不同的作者选择了或多或少的明确。如果你 git blame,我希望你会看到这些是在不同的时间 and/or 由不同的人写的。