为什么 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 由不同的人写的。
我正在研究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 由不同的人写的。