0

私はスレッドセーフなシングルトンについて読んでいて、どこにでもある実装には次のようなgetInstance()メソッドがあります。

Singleton* getInstance()
{
    if ( !initialized )
    {
        lock();
        if ( !initialized )
        {
            instance = new Singleton();
            initialized = true;
        }
        unlock();
    }

    return instance;
}
  • これは実際にスレッドセーフですか?
  • 何かを見逃したことがありますか、または「初期化された」がインスタンスの前に並べ替えられて設定される可能性があるため、この関数が初期化されていないインスタンスを返す可能性はわずかですか?

この記事は少し異なるトピックですが、一番上の答えは、上記のコードがスレッドセーフではないと思う理由を説明しています。

マルチスレッドCまたはC++プログラミングでvolatileが有用でないと見なされるのはなぜですか?

4

3 に答える 3

4

良い考えではありません。ロックを再確認してください。例えば:

http://www.drdobbs.com/cpp/c-and-the-perils-of-double-checked-locki/184405726

http://www.drdobbs.com/cpp/c-and-the-perils-of-double-checked-locki/184405772

于 2012-08-12T09:28:22.800 に答える
0

ミューテックスが再びロック解除されても、ポインターが返された後も引き続き使用できるため、実際にはスレッドセーフではありません。

できることは、シングルトンから継承する子クラスをスレッドセーフにすることです。その後、あなたは行ってもいいです。

于 2012-08-12T09:58:36.853 に答える