ミューテックスを使用しない C 11 でのマルチスレッドセーフなシングルトンの実装
C 11 では、マルチスレッドによりシングルトン クラスの実装に新たな懸念が生じます。ミューテックスを使用するとスレッドの安全性が保証されますが、パフォーマンスに影響を与える可能性があります。この記事では、ミューテックスに頼らずにロックフリーのシングルトンを作成する別のアプローチを検討します。
問題ステートメント:
C 11 で遅延初期化シングルトンを実装するにはどうすればよいですか?パフォーマンス上の理由でミューテックスを使用せずに?
提案された解決策:
atomic_compare_exchange_strong:
ロックフリーの初期化を実現するには、 std::atomic_compare_exchange_strong 関数を利用できます。このアトミック操作は、std::atomic 変数の期待値 (flag) とその望ましい値 (desr) を比較し、それらが一致する場合、変数を desr に更新します。
初期化プロセス:
初期化関数内で、次の手順を実行します。
スレッド セーフティ:
スレッドの同時実行は次の手段によって処理されます:
実装例:
<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 サイトの他の関連記事を参照してください。