6

次の 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()手動で配置する必要がありますか?

4

1 に答える 1

3

Linuxカーネルプログラミングの詳細についてはまだ知らないので、ここに部分的な(一般的な)回答があります。

x86 では、この操作はフル メモリ フェンスを伴いmfenceます。lfencesfencecmpxchg

atomic_cmpxchg()緩和されたメモリ モデルを持つ他のアーキテクチャでは、オペ コードへの変換方法に応じて、「解放」などの他のメモリ セマンティクスと組み合わせることができます。

それは物事のプロセッサ側にあります。ただし、操作を並べ替えることもできるコンパイラーがあるため、コンパイラーバリアがatomic_cmpxchg()(たとえば__asm__ __volatile__)によって暗示されていない場合は、必要になります。

于 2014-05-14T01:53:02.780 に答える