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

问题描述

我正在研究glibc(版本为2.32)。关于内存屏障,x86的读取,写入和完全屏障如下:

#define atomic_full_barrier() \
    __asm __volatile (LOCK_PREFIX "orl $0,(%%" SP_REG ")" ::: "memory")
#define atomic_read_barrier() __asm ("" ::: "memory")
#define atomic_write_barrier() __asm ("" ::: "memory")

cppreferencethis answer所说,volatile 告诉编译器不要优化和重新排序此指令。

为什么读写障碍不使用__asm __volatile,而完全障碍使用它?

解决方法

没有输出操作数的asm语句是隐式volatilesimilar question)。
因此,它们实际上都是volatile,这对于优化程序不会删除它们是必不可少的。

(non-volatile asm被假定为是没有副作用的纯函数,仅在需要产生输出时才运行。仅当/当优化程序确定需要运行asm时,clobber才被破坏。声明)。

不同的作者选择或多或少地保持明确。如果您git blame,我希望您会看到它们是在不同的时间和/或由不同的人写的。