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();

};

现在我有另一个工厂类,负责在单线程环境中创建所有单例。单例可以在多个线程中使用,并且方法受到互斥锁的保护。

第一个问题

这种方法可以接受吗?

第二个问题

我有一个必须是线程安全的复杂类。
这个类必须是一个单例。调用类的不同方法怎么可能是线程安全的。例如。

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

我怎样才能得到这个?

4

1 回答 1

1

你的第二个问题的答案:

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 回答