首页 > 解决方案 > 为什么 arm atomic_[read/write] 操作实现为 volatile 指针?

问题描述

他是 atomic_read 实现的示例:

#define atomic_read(v) (*(volatile int *)&(v)->counter)                                  

另外,我们是否应该明确地使用内存屏障来进行 arm 上的原子操作?

标签: linux-kernelarmarm64atomicmemory-barriers

解决方案


是的,转换为 volatile 是为了防止编译器假设 v 的值不能改变。至于使用内存屏障,GCC 内置程序已经允许您指定所需的内存顺序,无需手动执行:https ://gcc.gnu.org/onlinedocs/gcc-9.2.0/gcc/_005f_005fatomic-Builtins .html#g_t_005f_005fatomic-Builtins

GCC 的默认行为是使用__ATOMIC_SEQ_CSTwhich 将在 Arm 上发出必要的屏障,以确保您的原子按照您在代码中放置的顺序执行。为了优化 Arm 的性能,您将需要考虑使用较弱的语义来允许编译器消除障碍并让硬件更快地执行。有关 Arm 架构具有的内存屏障类型的更多信息,请参阅https://developer.arm.com/docs/den0024/latest/memory-ordering/barriers


推荐阅读