问题描述
我正在研究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")
如cppreference和this answer所说,volatile
告诉编译器不要优化和重新排序此指令。
为什么读写障碍不使用__asm __volatile
,而完全障碍使用它?
解决方法
没有输出操作数的asm
语句是隐式volatile
(similar question)。
因此,它们实际上都是volatile
,这对于优化程序不会删除它们是必不可少的。
(non-volatile
asm被假定为是没有副作用的纯函数,仅在需要产生输出时才运行。仅当/当优化程序确定需要运行asm时,clobber才被破坏。声明)。
不同的作者选择或多或少地保持明确。如果您git blame
,我希望您会看到它们是在不同的时间和/或由不同的人写的。