微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决为什么在glibc中对x86的读写屏障不使用__volatile asm?

我正在研究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语句是隐式volatilesimilar question)。
因此,它们实际上都是volatile,这对于优化程序不会删除它们是必不可少的。

(non-volatile asm被假定为是没有副作用的纯函数,仅在需要产生输出时才运行。仅当/当优化程序确定需要运行asm时,clobber才被破坏。声明)。

不同的作者选择或多或少地保持明确。如果您git blame,我希望您会看到它们是在不同的时间和/或由不同的人写的。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。