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

标签 c gcc glibc inline-assembly memory-barriers

我正在学习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 语句是隐式 volatile ( GCC manual )。
所以它们实际上都是 volatile ,这对于优化器不删除它们是必要的。

(非 volatile asm 被假定为一个没有副作用的纯函数,仅在需要生成输出时才运行。仅当优化器决定需要时,破坏者才会被破坏运行 asm 语句)。

不同的作者选择或多或少地明确。如果您git Blame,我希望您会看到这些是在不同时间和/或由不同人编写的。

关于c - 为什么 glibc 中 x86 的读写屏障不使用 __volatile asm?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64116260/

相关文章:

c - 在 C 中使用 pthreads 在循环中创建线程时是否需要延迟?

c - 在 Switch-Case 构造中使用 'return' 与 'break' 有什么好处?

c - OpenGL 问题 : 'incompatible' vs 'cannot find'

c++ - 尝试使用线程运行 CamShift

c - Linux 中的启动默认堆大小?

node.js - Node JS 静态编译

将文本文件复制到数组

c - 如何索引 "struct"成员?如何在 C 中正确访问它们?

c++ - 是否有用于使用 gcc 构建 MS Visual C++ Express 的免费开源工具?

GCC 原子内置函数和 volatile