BTS のように、load-modify-store 命令の後にフェンス命令を配置すると、2 番目の命令をアトミックに処理できるようになることを読みました。しかし、インテルのドキュメントによると、フェンス命令は次のように説明されています。
(MFENCE)
MFENCE 命令の前に発行されたすべてのメモリからのロード命令とメモリへのストア命令に対してシリアル化操作を実行します。このシリアル化操作により、プログラム順序で MFENCE 命令に先行するすべてのロードおよびストア命令が、MFENCE 命令に続くロードまたはストア命令の前にグローバルに可視になることが保証されます。
では、そのような動作はどのようにして前述の「原子性」を保証するのでしょうか?
具体的には、異なるプロセッサによって実行される次のコードの 2 つの同時実行がある場合、フェンスはどのようにして両方のケースで 0 を CF に読み込むことを防止するでしょうか?
start memory assumption: [addr] contains the word 0
BTS WORD PTR [addr], 0
MFENCE