セットおよびテストxchg
ベースのアセンブリ ロックがあります。私の質問は:
命令を使用する場合、メモリフェンシング ( mfence
、sfence
またはlfence
)を使用する必要がありxchg
ますか?
編集 :
64 ビット プラットフォーム: Intel nehalem を使用
セットおよびテストxchg
ベースのアセンブリ ロックがあります。私の質問は:
命令を使用する場合、メモリフェンシング ( mfence
、sfence
またはlfence
)を使用する必要がありxchg
ますか?
編集 :
64 ビット プラットフォーム: Intel nehalem を使用
他の回答で述べたように、ここではロックプレフィックスは暗黙的であるため、アセンブラーレベルで問題はありません。インライン アセンブラとして使用する場合、問題は C (または C++) レベルにある可能性があります。ここでは、コンパイラが .xml に関して命令を並べ替えないようにする必要がありますxchg
。gcc (または従兄弟) を使用している場合、通常は次のようにします。
__asm__ __volatile__("xchgl %1, %0"
: "=r"(ret)
: "m"(*point), "0"(ret)
: "memory");
つまり、命令を揮発性として宣言し、「メモリ」クロバーを追加します。
Intel 64 and IA-32 Architectures Software Developer's Manual, Volume 3A のChapter 8 Bus Lockingによると、
メモリ順序付けモデルは、ロックされた命令が先に実行されたり後で実行されたりして、ロードとストアが並べ替えられるのを防ぎます。
したがって、ロックされたXCHG
命令はメモリ バリアとして機能し、追加のバリアは必要ありません。
いいえxchg
、ハードウェアレベルでの一貫性を保証するものにコンパイルすることが保証されています。
Intel のマニュアルによると、xchg 命令には暗黙的なロック プレフィックスがあります。