我正在学习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")正如优先选择和这个答案所说,volatile告诉编译器不要优化和重新排序这个指令。
为什么写和读屏障不使用__asm __volatile,而全障碍使用它?
发布于 2020-09-29 09:08:58
没有输出操作数的asm语句是隐式volatile (GCC手册)。
因此,它们实际上都是volatile,这对于优化器不删除它们是必要的。
(非volatile asm被假定为没有副作用的纯函数,只有在需要时才运行以产生输出。只有当/当优化器决定需要运行asm语句时,才会对其进行重击)。
不同的作者选择或多或少的明确。如果您是git blame,我希望您会看到它们是在不同的时间和/或由不同的人编写的。
https://stackoverflow.com/questions/64116260
复制相似问题