以下两个引文似乎相互矛盾:
https://www.kernel.org/doc/Documentation/atomic_ops.txt
int atomic_cmpxchg(atomic_t * v,int old,int new);
这对原子值执行原子比较交换操作 v,具有给定的旧值和新值。像所有atomic_xxx操作一样, atomic_cmpxchg只会满足其原子性语义 * v的所有其他访问都是通过atomic_xxx操作执行的。
atomic_cmpxchg需要围绕操作显式内存障碍。
VS
https://www.kernel.org/doc/Documentation/memory-barriers.txt
修改内存中某些状态并返回的任何原子操作 有关状态(旧的或新的)的信息意味着SMP条件 实际操作每一侧的一般内存屏障(smp_mb()) (显式锁定操作除外,稍后描述)。 其中包括:
<...> atomic_xchg(); atomic_cmpxchg(); <...>
这些用于实现LOCK-class和UNLOCK-class操作以及调整引用 反对对象破坏,以及隐含的记忆 障碍效应是必要的。
那么应该手动设置内存障碍atomic_xchg()
吗?
答案 0 :(得分:2)
我还不了解Linux内核编程细节,所以这是一个部分(一般)答案。
在x86上,此操作带有完整的内存栅栏,mfence
/ lfence
/ sfence
周围cmpxchg
操作
在具有宽松存储器模型的其他架构上,它可以与其他存储器语义耦合,例如, “发布”,具体取决于atomic_cmpxchg()
转化为操作码的方式。
这是处理器方面的事情。但是,有编译器也可以对操作进行重新排序,因此如果atomic_cmpxchg()
(例如__asm__ __volatile__
)没有暗示编译器屏障,则需要一个。