std::atomic はロックをどこに隠しますか?
複数要素のデータ構造では、標準のアトミック型が常にロックであるとは限りません。無料。これは、CPU がロックの助けを借りずにそのようなデータを処理できないことが原因です。これを説明するために、次の例を考えてみましょう。
#include <iostream> #include <atomic> struct foo { double a; double b; }; std::atomic<foo> var; int main() { std::cout << var.is_lock_free() << std::endl; std::cout << sizeof(foo) << std::endl; std::cout << sizeof(var) << std::endl; }
Linux/gcc の出力では、次のことがわかります。
0 16 16
アトミック タイプと foo 構造体が同じ量のスペースを占有していると仮定します。 、ロックがアトミックに保存される可能性は低いと思われます。しかし、この難問の背後にある真実は正確には何なのでしょうか?
複数のインスタンスに対するロックの場所と影響
通常のアプローチには、キー付きのミューテックス (またはスピンロック) のハッシュ テーブルを使用することが含まれます。アトミックオブジェクトのアドレスに。このハッシュ関数は、サイズ 2^n の配列へのインデックスとしてアドレスの最下位ビットを優先します。
あるいは、LLVM std::atomic 実装には、自動エイリアシングを防ぐために上位アドレス ビットが組み込まれています。これにより、2 の有意な累乗で区切られたオブジェクトが同じロックにマップされなくなります。
重要なのは、アトミック オブジェクトは、各プロセスが装備されている個別のプロセス間でメモリ内で共有される場合にのみ、ロックフリーの方法で動作することです。
ハッシュ テーブル内の衝突には注意が必要な場合があります。これによって正確性の問題は発生しませんが、複数のスレッド間の競合が促進され、パフォーマンスが損なわれる可能性があります。ただし、問題のプラットフォームでは通常、ロックのないアトミック オブジェクトが好まれるため、これが発生することは比較的まれです。
デッドロックについては、std::atomic 関数がロックの取得を控えているため、これは問題ではありませんのでご安心ください。複数のオブジェクトを同時に操作します。したがって、ロックの取得を担当するライブラリ コードは、既存のロックを保持しながら追加のロックを確保しようとすることはありません。
以上が`std::atomic` は隠しロックを使用しますか?使用する場合、それはどこにありますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。