为什么 arm atomic_[read/write] 操作实现为易失性指针?

why does arm atomic_[read/write] operations implemented as volatile pointers?

他是atomic_read实施的例子:

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

此外,我们是否应该为 arm 上的原子操作显式使用内存屏障?

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

He is example of atomic_read implementation:

实际上是一个有问题的问题,它假设转换不是 nop,不能保证

Also, should we explicitly use memory barriers for atomic operations on arm?

可能吧。这取决于您在做什么以及您期望