C ++ 11のようなアトミック変数について話すときatomic<>
、それはロックフリーですか?それとも、ロックフリーネスは何か違うのですか?アトミック変数を使用してキューを管理する場合、ロックフリーキューよりも遅くなりますか?
2 に答える
この標準では、アトミックオブジェクトがロックフリーであるかどうかは指定されていません。タイプTのロックフリーアトミック操作を提供しないプラットフォームでは、atomic<T>
オブジェクトは、ロックフリーではないミューテックスを使用して実装される場合があります。その場合、実装でこれらのオブジェクトを使用するコンテナもロックフリーではありません。
atomic<T>
この標準は、変数がロックフリーであるかどうかをチェックする方法を提供します。var.is_lock_free()
またはを使用できますatomic_is_lock_free(&var)
。T
これらの関数は、特定のプログラムの実行時に同じタイプに対して常に同じ値を返すことが保証されています。のような基本的なタイプの場合、そのタイプへのロックフリーアトミックアクセスが利用可能かどうかを指定するint
マクロも提供されます(例)。ATOMIC_INT_LOCK_FREE
ロックフリーは通常、同期メカニズムが相互排除ではない、複数のスレッド間で共有されるデータ構造に適用されます。意図は、すべてのスレッドがミューテックスでスリープするのではなく、ある種の進歩を続けなければならないということです。
atomic<T>
変数はロックを使用しませんが(少なくともT
プラットフォーム上でネイティブにアトミックである場合)、上記の意味でロックフリーではありません。ロックフリーコンテナの実装でそれらを使用することもできますが、それだけでは十分ではありません。
たとえば、atomic<queue<T>>
通常のデータが突然std::queue
ロックフリーのデータ構造になることはありません。atomic_queue<T>
ただし、メンバーがである真にロックフリーを実装することはできますatomic
。
atomic<int>
ネイティブにアトミックであり、プラットフォームのロックでエミュレートされていない場合でも、興味深い方法でロックフリーになるわけではないことに注意してください。この意味で、プレーンint
はすでにロックフリーです。atomic<>
ラッパーを使用すると、メモリの順序を明示的に制御し、ハードウェア同期プリミティブにアクセスできます。