ホームページ >バックエンド開発 >C++ >ミューテックスを使用せずに C 11 でロックフリーのシングルトンを実装するにはどうすればよいですか?

ミューテックスを使用せずに C 11 でロックフリーのシングルトンを実装するにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-10-29 12:12:29453ブラウズ

How to Implement a Lock-Free Singleton in C  11 Without Mutexes?

ミューテックスを使用しない C 11 でのマルチスレッドセーフなシングルトンの実装

C 11 では、マルチスレッドによりシングルトン クラスの実装に新たな懸念が生じます。ミューテックスを使用するとスレッドの安全性が保証されますが、パフォーマンスに影響を与える可能性があります。この記事では、ミューテックスに頼らずにロックフリーのシングルトンを作成する別のアプローチを検討します。

問題ステートメント:

C 11 で遅延初期化シングルトンを実装するにはどうすればよいですか?パフォーマンス上の理由でミューテックスを使用せずに?

提案された解決策:

atomic_compare_exchange_strong:

ロックフリーの初期化を実現するには、 std::atomic_compare_exchange_strong 関数を利用できます。このアトミック操作は、std::atomic 変数の期待値 (flag) とその望ましい値 (desr) を比較し、それらが一致する場合、変数を desr に更新します。

初期化プロセス:

初期化関数内で、次の手順を実行します。

  1. フラグを 1 に設定して、初期化が進行中であることを示します。
  2. atomic_compare_exchange_strong を使用して、次のことを確認します。 flag は 1 です。そうであれば、初期化を続行します。
  3. CAS が成功した場合、初期化が成功したことを示すために flag が 2 に設定されます。
  4. CAS が失敗した場合は、別のスレッドがすでに初期化されています。シングルトン。

スレッド セーフティ:

スレッドの同時実行は次の手段によって処理されます:

  • If フラグはすでに 2 であり、初期化はすでに完了しています。
  • フラグが 0 の場合、atomic_compare_exchange_strong を使用して初期化を試みます。
  • フラグが 1 の場合、現在別のスレッドが初期化中であるため、現在のスレッドは待機します。

実装例:

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

    static bool initialize(const string& name);
};</code>

結論:

atomic_compare_exchange_strong 関数を利用することで、 C 11 では、ミューテックスに依存せずにマルチスレッドセーフなシングルトンを実装できます。このアプローチにより、常に 1 つのスレッドだけがシングルトンを正常に初期化することが保証されます。

以上がミューテックスを使用せずに C 11 でロックフリーのシングルトンを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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