ホームページ  >  記事  >  バックエンド開発  >  C 11 では、アトミック操作によるロックフリーのシングルトンは、ミューテックスを使用するよりも優れたアプローチですか?

C 11 では、アトミック操作によるロックフリーのシングルトンは、ミューテックスを使用するよりも優れたアプローチですか?

Susan Sarandon
Susan Sarandonオリジナル
2024-10-31 21:21:02427ブラウズ

Is a Lock-Free Singleton with Atomic Operations a Better Approach in C  11 Than Using Mutexes?

C 11 でのマルチスレッド シングルトンの実装

C 11 のマルチスレッド機能の出現により、シングルトンの実装にミューテックスを使用する従来のアプローチは使用できなくなる可能性があります。

アトミック操作によるロックフリー シングルトン

ミューテックスなしでシングルトンを作成する 1 つの方法は、アトミック操作を使用することです。アトミック bool 変数と std::atomic_compare_exchange_strong() 関数を使用すると、次のソリューションを実装できます:

<code class="cpp">public class Singleton {
    private static atomic<int> flag = 0;
    private static string name;

    public static bool initialized() {
        return (flag == 2);
    }

    public static bool initialize(string name_) {
        if (flag == 2) {
            return false; // Already initialized
        }
        int exp = 0, desr = 1;
        bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr);

        if (!willInitialize) {
            return false; // Another thread CASed before us
        }
        initialize_impl(name_);
        assert(flag == 1);
        flag = 2;
        return true;
    }

    private static void initialize_impl(string name) {
        name = name;
    }
}</code>

C 11 スレッドセーフな初期化

C 11スレッドセーフな静的初期化が導入され、手動ロックが不要になりました。静的ローカル変数が初期化されるのを待機する同時実行により、次の簡略化された実装が可能になります:

<code class="cpp">static Singleton& get() {
  static Singleton instance;
  return instance;
}</code>

シングルトンの代替

これらのソリューションは、マルチスレッドの安全なシングルトン実装を提供する場合、シングルトン パターン自体が常に最良の設計選択であるとは限りません。オブジェクトを関数の引数として渡す、依存関係注入を使用する、状態パターンを使用するなどの代替案を検討してください。

以上がC 11 では、アトミック操作によるロックフリーのシングルトンは、ミューテックスを使用するよりも優れたアプローチですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。