次の 2 つの引用は矛盾しているように見えます。
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 では、操作の周りに明示的なメモリ バリアが必要です。
対
https://www.kernel.org/doc/Documentation/memory-barriers.txt
メモリ内のいくつかの状態を変更し、状態 (古いまたは新しい) に関する情報を返すアトミック操作は、実際の操作の両側で SMP 条件付きの一般的なメモリ バリア (smp_mb()) を意味します (明示的なロック操作を除き、説明されています)。後で)。これらには以下が含まれます:
<...> atomic_xchg(); atomic_cmpxchg(); <...>
これらは、LOCK クラスおよび UNLOCK クラスの操作の実装や、オブジェクトの破棄に向けた参照カウンターの調整などに使用されるため、暗黙的なメモリ バリア効果が必要です。
それでは、メモリバリアをatomic_xchg()
手動で配置する必要がありますか?