私は参照カウントスキーマを実装しています。このためには、インターロック機能が必要ですが、メモリフェンスは必要ありません(私が理解している限り)。
残念ながら、WindowsにのみInterlockedDecrementNoFenceコンパイラが組み込まれています。asmインライン化でこれを行うにはどうすればよいですか?gcc/clangにもこれが必要です。
私は参照カウントスキーマを実装しています。このためには、インターロック機能が必要ですが、メモリフェンスは必要ありません(私が理解している限り)。
残念ながら、WindowsにのみInterlockedDecrementNoFenceコンパイラが組み込まれています。asmインライン化でこれを行うにはどうすればよいですか?gcc/clangにもこれが必要です。
少なくとも固有のメモリフェンス操作(プラットフォームによって異なります)の欠如は、この操作のセマンティクスではほとんど不可能になります。アトミックインクリメント/デクリメントが機能するには、他のプロセッサが変数に対して独自の操作を実行する前に、アトミック操作の値を確認する必要があります。また、変数に対する操作の可視性には、合計が保証されている必要があります。注文。メモリバリアは、標準のメモリ操作が取得/解放セマンティクスを持つx86のような強力なメモリモデルのような暗黙的なものでさえ、アトミックインクリメント/デクリメント操作の正確さにとって最も重要です。
MSVC / gccのドキュメントにメモリバリアがあると記載されている場合でも、x86ではMFENCE
、プラットフォームの強力なメモリモデルのために、実際のメモリバリア(つまり、命令)は適用されないことに注意してください。操作のアトミック性を確保するためのメモリバスのロック。一方、IA64は、そのプラットフォームのメモリモデルが弱いため、メモリバリアが必要になります。同じことがARMにも当てはまります。
これは直接的な答えではなく、代替案です。C11(またはC ++ 11)を使用できる場合は、?を使用した不可分操作はmemory_order_relaxed
どうでしょうか。コンパイラは、弱いメモリモデルプラットフォームでメモリフェンスを生成しない場合があります。(コンパイラのベンダー/バージョンによって異なります)
#include <stdatomic.h>
atomic_int var;
int oldval;
oldval = atomic_fetch_sub_explicit(&var, 1, memory_order_relaxed);