ホームページ > バックエンド開発 > C++ > Meyers のシングルトンはスレッドセーフですか?

Meyers のシングルトンはスレッドセーフですか?

DDD
リリース: 2024-12-29 11:40:11
オリジナル
415 人が閲覧しました

Is Meyers' Singleton Thread-Safe?

マイヤーズのシングルトン: スレッド セーフティの評価と強化

マイヤーズのシングルトン パターンの実装では遅延初期化が利用されていますが、スレッド セーフティは維持されています。懸念があります。この記事では、指定されたコードにおけるスレッド セーフの複雑さを詳しく掘り下げます。

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート