スレッドセーフなダブルチェックロック(シングルトンまたは遅延初期化)を考慮して、多くの質問を読んでいます。いくつかのスレッドでは、パターンは完全に壊れていて、解決策を示唆するものがあります。C++ 11:遅延初期化の安全なダブルチェックロック。可能?
私の質問は、完全にスレッドセーフなダブルチェックされたロックパターンをC++で記述する方法ですか?もしそうなら、それはどのように見えるのですか?
これは、C++ 11の場合は、それが簡単になると思います。私が知る限りでは、C++ 11は、必要な改善をもたらす可能性のあるメモリモデルを改善しました。
私は、ダブルチェックガード変数をvolatileにすることでJavaで可能であることを知っています。 C++ 11はJavaのメモリモデルの大部分を借用していたので、それは可能かもしれないと思いますが、どうですか?
C++ 11を使用できる場合は、ダブルチェックロックビジネス全体を無視し、静的ローカル変数または 'std :: call_once'を使用します。 –
静的なローカルは遅延して初期化されていますか?そして 'call_once'について:これは、一度呼び出しが完全に作成されていない参照を変数に書き込まないようにするにはどうしますか? – gexicide
はい、静的ローカルはスレッドセーフな方法で遅延的に初期化されます。そして 'call_once'は、被験者が一度だけ呼び出されることを保証します。実際に関数を実行する前に 'call_once'の他の呼び出しが返ってこないことを確認してください(http://en.cppreference.com/w/cpp/thread/call_onceを参照してください)。それはどのように実装されます。これらの2つのものは基本的に存在するので、
のバグdouble-checked lockingの実装を書いて気にしたくありません。 –