以下两个引用似乎矛盾:
https://www.kernel.org/doc/Documentation/atomic_ops.txt
int atomic_cmpxchg(atomic_t * v,int old,int new);
这会对具有给定的旧值和新值的原子值v执行原子比较交换操作。像所有atomic_xxx操作一样,只要通过atomic_xxx操作执行* v的所有其他访问,atomic_cmpxchg将仅满足其原子性语义。
atomic_cmpxchg需要在操作周围使用显式的内存屏障。
与
https://www.kernel.org/doc/Documentation/memory-barriers.txt
任何修改内存中某些状态并返回状态信息(旧的或新的)的原子操作都意味着在实际操作的每一端都存在一个SMP条件的通用内存屏障(smp_mb())(除了显式锁定操作,已描述)后来)。这些包括:
<...> atomic_xchg(); atomic_cmpxchg(); <...>这些用于实现LOCK类和UNLOCK类操作以及针对对象破坏调整参考计数器的事情,因此隐式内存屏障效应是必需的。
因此,应该atomic_xchg()
手动消除内存障碍吗?