0

POCO フレームワークでは、SingletonHodler は sigleton オブジェクトを管理するためのテンプレート クラスです。シングルトン オブジェクトを取得するメソッドは次のとおりです。

    S* get()
    /// Returns a pointer to the singleton object
    /// hold by the SingletonHolder. The first call
    /// to get will create the singleton.
{
    FastMutex::ScopedLock lock(_m);
    if (!_pS) _pS = new S;
    return _pS;
}

問題は、このメソッドが常にミューテックスを使用して、マルチスレッド環境で複数のシングルトン オブジェクトが作成されないようにすることです。メソッドが初めて呼び出されたときに同期するのが適切だと思います。その後同期すると、リソースが無駄になります。ダブル チェック ロックでこの問題を解決できることはわかっていますが、壊れている可能性があります。

私の質問は、POCO がリソースを節約するよりも、マルチスレッド環境での安全性を確保するかどうかです。

4

1 に答える 1

0

あなたの考えに従ってください:

   MySingleton* s = mySingletonHolder.get();
   s->doSomething(); //no locking
   ...
   s->doSomething(); //no locking

明らかに、常に次のように使用する場合:

   mySingletonHolder.get()->doSomthing();
   ...
   mySingletonHolder.get()->doSomthing();

常にロックのオーバーヘッドがあります。

ところで、マルチスレッド シナリオでシングルトン インスタンスを使用している場合は、doSomething()の呼び出しがスレッド セーフであることを保証する必要があります。mySingletonHolder.get()->doSomthing();のみを実行する ことを保証するものではありません。

于 2013-10-29T07:43:14.693 に答える