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