Igo*_* R. 5 multithreading synchronization atomic linux-kernel 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_xxx操作执行* v的所有其他访问,atomic_cmpxchg将仅满足其原子性语义。
atomic_cmpxchg需要在操作周围使用显式的内存屏障。
与
https://www.kernel.org/doc/Documentation/memory-barriers.txt
任何修改内存中某些状态并返回状态信息(旧的或新的)的原子操作都意味着在实际操作的每一端都存在一个SMP条件的通用内存屏障(smp_mb())(除了显式锁定操作,已描述)后来)。这些包括:
Run Code Online (Sandbox Code Playgroud)<...> atomic_xchg(); atomic_cmpxchg(); <...>这些用于实现LOCK类和UNLOCK类操作以及针对对象破坏调整参考计数器的事情,因此隐式内存屏障效应是必需的。
因此,应该atomic_xchg()手动消除内存障碍吗?
我还不知道 Linux 内核编程细节,所以这里是部分(一般)答案。
在 x86 上,此操作带有完整的内存栅栏,不需要在mfence// around op 中。lfencesfencecmpxchg
在具有宽松内存模型的其他体系结构上,它可以与其他内存语义(例如“释放”)结合使用,具体取决于如何atomic_cmpxchg()转换为操作码。
这是在处理器方面。但是,有编译器也可以对操作进行重新排序,因此如果atomic_cmpxchg()(例如__asm__ __volatile__)未暗示编译器屏障,则您将需要一个。
| 归档时间: |
|
| 查看次数: |
1454 次 |
| 最近记录: |