ミューテックスを使用しない C 11 でのマルチスレッド シングルトンの実装
C 11 でのマルチスレッド機能の導入により、シングルトンを実装する方法について疑問が生じます。パフォーマンスの最適化のためにミューテックスを利用しません。推奨されるアプローチには、アトミック変数と std::atomic_compare_exchange_strong() 関数の使用が含まれます。
<code class="cpp">class Singleton { public: static bool isInitialized() { return (flag == 2); } static bool initizalize(const string& name_) { if (flag == 2) return false; if (flag == 1) return false; int exp = 0; int desr = 1; bool willInitialize = std::atomic_compare_exchange_strong(&flag, &exp, desr); if (!willInitialize) { cout << "Somebody else CASed at aprox same time" << endl; return false; } else { initialize_impl(name_); assert(flag == 1); flag = 2; return true; } } static void clear() { name.clear(); flag = 0; } private: static void initialize_impl(const string& name_) { name = name_; } static atomic<int> flag; static string name; };</code>
アトミック変数と std::atomic_compare_exchange_strong() 関数は、スレッド同期のオーバーヘッドを導入せずにスレッドの安全性を確保します。ただし、このアプローチでは、データ競合を防止し、適切な初期化を確保するために注意深い取り扱いが必要です。
C 11 標準は初期化の安全性を強制します
興味深いことに、C 11 の標準では、特定のシナリオでは手動ロック。次のコード スニペットは、この動作を利用しています。
<code class="cpp">static Singleton& get() { static Singleton instance; return instance; }</code>
静的変数インスタンスを初期化しようとする同時実行は、その完了を暗黙的に待機し、潜在的な競合状態を軽減します。
シングルトン アンチパターン
上記のアプローチはマルチスレッド シングルトン実装のソリューションを提供しますが、シングルトンの使用は一般に推奨されないことに注意してください。結合や状態の依存関係が生じ、単体テストが複雑になる可能性があります。多くの場合、共有リソースと依存関係を管理するには、代替設計パターンが推奨されます。
以上がミューテックスを使用せずに C 11 でマルチスレッド シングルトンを実装するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。