遅延初期化を使用した次の実装Singleton
(Meyers のシングルトン) はスレッドセーフですか?
static Singleton& instance()
{
static Singleton s;
return s;
}
そうでない場合、その理由と、それをスレッドセーフにする方法は何ですか?
ベストアンサー1
でC++11スレッドセーフです。標準、§6.7 [stmt.dcl] p4
:
変数の初期化中に制御が宣言に入ると、同時実行は待機する初期化を完了します。
GCC と VS によるこの機能のサポート (同時実行による動的初期化と破棄、 としても知られているMSDN の Magic Statics) 以下のとおりであります:
- Visual Studio: サポート開始ビジュアルスタジオ2015
- GCC: サポート開始GCCC4.3 の新機能
コメントをくださった@Mankarse と@olen_gam に感謝します。
でC++03このコードはスレッドセーフではありませんでした。Meyersによる記事があります。「C++ と二重チェックロックの危険性」この論文では、スレッドセーフなパターンの実装について議論しており、その結論は、多かれ少なかれ、(C++03では)インスタンス化メソッドの周りの完全なロックが基本的にすべてのプラットフォームで適切な並行性を保証する最も簡単な方法であるが、ほとんどの二重チェックロックパターンのバリアントは、特定のアーキテクチャにおける競合状態ただし、命令がインターリーブされない限り、メモリ バリアが戦略的に配置されます。