マイヤーズのシングルトン: スレッド セーフティの評価と強化
マイヤーズのシングルトン パターンの実装では遅延初期化が利用されていますが、スレッド セーフティは維持されています。懸念があります。この記事では、指定されたコードにおけるスレッド セーフの複雑さを詳しく掘り下げます。
static Singleton& instance() { static Singleton s; return s; }
C 11 以降
C 11 では、グローバル オブジェクトの遅延初期化は次のとおりです。標準の保証によりスレッド セーフです。同時初期化では、完了するまで待機する必要があります。 GCC と Visual Studio はどちらもこの機能をサポートしています。
したがって、C 11 以降の環境では、Meyers のシングルトン実装はスレッド セーフです。
C 03 以前では
C 03 以前では、提供されたコードはスレッド セーフではありません。 Meyers 氏の記事で説明されているように、ダブルチェックされたロック パターンは、特定のアーキテクチャでは競合状態の影響を受ける可能性があります。このコンテキストでスレッド セーフを実現するには、インスタンス化メソッドを完全にロックすることをお勧めします。
C 03 スレッド セーフのコード
ここでは、C 03 スレッド セーフのコードの変更を示します。 C 03 スレッド セーフティ:
static Singleton*& instance() { static Singleton* s = nullptr; static std::mutex s_mutex; std::lock_guard<std::mutex> guard(s_mutex); if (!s) s = new Singleton; return s; }
この実装では、ミューテックスを使用して初期化中にアクセスを同期し、スレッドを保証します安全性。
以上がMeyers のシングルトンはスレッドセーフですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。