1

シングルトン クラスがあり、シングルトンの最初の呼び出しは 1 つのスレッドだけで行われると確信しています。遅延初期化でシングルトンを実装しました。

class MySingleton : private boost::noncopyable {
public:

    /** singleton access. */
    static MySingleton & instance()
    {
        static MySingleton myInstance;
        return myInstance;
    }

    void f1();
    void f2();
    void f3();
    void f4();

private:

    MySingleton();

};

これで、単一のスレッド環境ですべてのシングルトンを作成する責任を持つ別のファクトリ クラスができました。シングルトンは複数のスレッドから使​​用でき、メソッドはミューテックスから保護されます。

最初の質問

このアプローチは受け入れられますか?

2 番目の質問

スレッドセーフでなければならない複雑なクラスがあります。
このクラスはシングルトンでなければなりません。クラスのさまざまなメソッドの呼び出しがスレッドセーフであることはどうすればよいでしょうか。例えば。

{ 
    MySingletonLock lock;
    // Other thread must wait here.
    MySingleton::instance().f1();
    MySingleton::instance().f3();
}

どうすればこれを入手できますか?

4

1 に答える 1

1

2番目の質問への答え:

class MyProtectedSingleton: public MySingleton
{
public:
   void f1()
   {
       MySingletonLock lock;
            // Other thread must wait here.
       MySingleton::instance().f1();    
   }

  void f2()
  {
      MySingletonLock lock;
        // Other thread must wait here.
      MySingleton::instance().f2();    
  }
};

MyProtectedSingleton のラッパーを介して f1、f2 などを呼び出します。

于 2013-05-20T15:37:40.477 に答える