我正在学习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
( GCC manual )。
所以它们实际上都是 volatile
,这对于优化器不删除它们是必要的。
(非 volatile
asm 被假定为一个没有副作用的纯函数,仅在需要生成输出时才运行。仅当优化器决定需要时,破坏者才会被破坏运行 asm 语句)。
不同的作者选择或多或少地明确。如果您git Blame
,我希望您会看到这些是在不同时间和/或由不同人编写的。
关于c - 为什么 glibc 中 x86 的读写屏障不使用 __volatile asm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64116260/