C++による効率的なスレッドセーフシングルトン
2023-09-10 17:11:52
質問
シングルトン・クラスの通常のパターンは次のようなものです。
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
inst = new Foo(...);
return *inst;
}
しかし、私の理解では、この解決策はスレッドセーフではありません。) Foo のコンストラクタは複数回呼び出される可能性があり (これは問題ではないかもしれません)、2) 別のスレッドに返される前に inst が完全に構築されない可能性があるためです。
1つの解決策は、メソッド全体にmutexを巻き付けることですが、その場合、実際にそれが必要になったずっと後に、同期のオーバーヘッドを支払うことになります。代替案は次のようなものです。
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
{
pthread_mutex_lock(&mutex);
if(inst == NULL)
inst = new Foo(...);
pthread_mutex_unlock(&mutex);
}
return *inst;
}
これは正しい方法なのでしょうか、それとも何か注意すべき落とし穴があるのでしょうか?例えば、静的な初期化順序の問題が発生する可能性があります。つまり、getInst が最初に呼ばれたとき、inst は常に NULL であることが保証されますか?
どのように解決するのですか?
あなたの解決策は「二重チェックロック」と呼ばれるもので、あなたの書き方はスレッドセーフではありません。
これは Meyers/Alexandrescu 論文 がその理由を説明していますが、この論文も広く誤解されています。この論文により、「C++ では二重チェック ロックが安全でない」というミームが始まりましたが、実際の結論は、C++ における二重チェック ロックは安全に実装でき、明白でない場所にメモリ バリアを使用する必要があるだけであるというものです。
この論文には、DLCP を安全に実装するためにメモリ バリアを使用する方法を示す疑似コードが含まれています。
関連
-
[解決済み】C++ クラスヘッダが含まれているときに「不明な型」があるのはなぜですか?重複
-
[解決済み】IntelliSense:オブジェクトに、メンバー関数と互換性のない型修飾子がある
-
[解決済み】デバッグアサーションに失敗しました。C++のベクトル添え字が範囲外
-
[解決済み】エラー:strcpyがこのスコープで宣言されていない
-
[解決済み】警告 - 符号付き整数式と符号なし整数式の比較
-
[解決済み] 静的クラスとシングルトンパターンの違い?
-
[解決済み] Pythonでシングルトンを作成する
-
[解決済み] Swiftでdispatch_onceのシングルトンモデルを使う
-
[解決済み] デザインパターンについて。シングルトンはいつ使うべきですか?
-
[解決済み】C++ シングルトンデザインパターン
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】識別子 "string "は未定義?
-
[解決済み】C++エラーです。"配列は中括弧で囲まれたイニシャライザーで初期化する必要がある"
-
[解決済み】C++でランダムな2倍数を生成する
-
[解決済み】抽象クラス型の無効なnew-expression
-
[解決済み] クラスにデフォルトコンストラクタが存在しない。
-
[解決済み】C++の変数はイニシャライザーを持っているが、不完全な型?
-
[解決済み】浮動小数点例外エラーが発生する: 8
-
[解決済み】Visual C++で "Debug Assertion failed "の原因となる行を見つける。
-
[解決済み】std::cin.getline( ) vs. std::cin
-
[解決済み】C++ シングルトンデザインパターン