コードを介してメモリ バリアを実現できますか (CAS やその他の揮発性クラス、アトミック クラスなどのロック プリミティブを使用せずに)。
ディスラプターは、実際にロック プリミティブを使用することなく、それを達成できると思います。
これを理解する上での指針や参考文献は役に立ちます。
他のプログラム モード (できれば Java) に関する提案も歓迎します。
1 に答える
メモリ バリアの概念は、CAS およびその他のロック プリミティブと直交しています。たとえば、C++11 では、memory_order_relaxed で指定されている場合、CAS 操作でメモリ バリアをまったく持たないようにすることができます。一部のハードウェア (特に x68) は、常にメモリ バリアをアトミックな読み取り-変更-書き込み操作に関連付けます。
メモリ バリアを必要とするが CAS やロックを必要としないアルゴリズムの最良の例は、Dekker のプロトコルです。「ロケーションベースのメモリ フェンス」のセクション 1 は、プロトコルの概要を説明しています。
volatile がメモリ バリアとして役に立たない理由については、私のブログVolatile: Most Useless for Multi-Threaded Programmingを参照してください。
C++ 固有の情報: C++11 では、std::atomic_thread_fenceを使用します。前のリンクには、ロックせずに使用する良い例があります。古い C++ コンパイラを扱う場合は、ベンダー固有のルーチンに頼る必要があります。1 つの方法は、Intel Threading Building Blocks の tbb::atomic_fence() を使用することです。これは、見つけたプラットフォーム固有のフェンスのラッパーです。