我有一个单例类,我确信单例的第一次调用只由一个线程完成。我已经实现了懒惰初始化的单例。
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();
}
我怎么能得到这个?
答案 0 :(得分: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等。