9

セットおよびテストxchgベースのアセンブリ ロックがあります。私の質問は:

命令を使用する場合、メモリフェンシング ( mfencesfenceまたはlfence)を使用する必要がありxchgますか?

編集 :

64 ビット プラットフォーム: Intel nehalem を使用

4

4 に答える 4

16

他の回答で述べたように、ここではロックプレフィックスは暗黙的であるため、アセンブラーレベルで問題はありません。インライン アセンブラとして使用する場合、問題は C (または C++) レベルにある可能性があります。ここでは、コンパイラが .xml に関して命令を並べ替えないようにする必要がありますxchg。gcc (または従兄弟) を使用している場合、通常は次のようにします。

  __asm__ __volatile__("xchgl %1, %0"
                       : "=r"(ret)
                       : "m"(*point), "0"(ret)
                       : "memory");

つまり、命令を揮発性として宣言し、「メモリ」クロバーを追加します。

于 2012-01-27T07:29:37.407 に答える
16

Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A のChapter 8 Bus Lockingによると、

メモリ順序付けモデルは、ロックされた命令が先に実行されたり後で実行されたりして、ロードとストアが並べ替えられるのを防ぎます。

したがって、ロックされたXCHG命令はメモリ バリアとして機能し、追加のバリアは必要ありません。

于 2012-01-27T00:58:11.653 に答える
5

いいえxchg、ハードウェアレベルでの一貫性を保証するものにコンパイルすることが保証されています。

于 2012-01-27T00:43:29.740 に答える
0

Intel のマニュアルによると、xchg 命令には暗黙的なロック プレフィックスがあります。

于 2012-01-27T07:48:43.337 に答える