atomic_cmpxchg()是否意味着内存障碍?

时间:2014-01-06 13:00:19

标签: multithreading linux-kernel synchronization atomic compare-and-swap

以下两个引文似乎相互矛盾:

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()吗?

1 个答案:

答案 0 :(得分:2)

我还不了解Linux内核编程细节,所以这是一个部分(一般)答案。

在x86上,此操作带有完整的内存栅栏,mfence / lfence / sfence周围cmpxchg操作

在具有宽松存储器模型的其他架构上,它可以与其他存储器语义耦合,例如, “发布”,具体取决于atomic_cmpxchg()转化为操作码的方式。

这是处理器方面的事情。但是,有编译器也可以对操作进行重新排序,因此如果atomic_cmpxchg()(例如__asm__ __volatile__)没有暗示编译器屏障,则需要一个。