1. ホーム
  2. c++

[解決済み] MeyersのSingletonパターンの実装はスレッドセーフか?

2022-04-24 12:46:05

質問

以下の実装は、遅延初期化を使用した Singleton (Meyers' Singleton) のスレッドセーフですか?

static Singleton& instance()
{
     static Singleton s;
     return s;
}

そうでない場合、その理由とスレッドセーフにする方法は?

どのように解決するのですか?

C++11 の場合、スレッドセーフです。によると 標準 , §6.7 [stmt.dcl] p4 :

制御が入る場合 変数の初期化中に宣言が同時に行われた場合は 同時実行は待つ 初期化の完了を待つ。

GCCとVSのサポート機能( 並行処理による動的な初期化および破壊 としても知られています。 MSDNにおけるMagic Statics )は以下の通りです。

コメントを下さった @Mankarse さん、@olen_gam さん、ありがとうございました。


C++03 このコードはスレッドセーフではありません。というMeyersの記事があります。 C++とダブルチェック・ロックの危険性" その結論は、(C++03 では)インスタンス生成メソッドの完全ロックが、基本的にすべてのプラットフォームで適切な同時実行性を確保する最もシンプルな方法であり、ダブルチェックロックパターンの亜種のほとんどの形式は、次のような問題を引き起こすかもしれないということです。 特定のアーキテクチャにおけるレースコンディション ただし、戦略的に配置されたメモリバリアで命令をインターリーブする場合はこの限りではありません。