单例类的通常模式类似于
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
inst = new Foo(...);
return *inst;
}
然而,我的理解是,这个解决方案并不是线程安全的,因为1) Foo 的构造函数可能被调用不止一次(这可能有关系,也可能无关紧要) ,2) inst 在返回到另一个线程之前可能没有完全构造好。
一种解决方案是在整个方法周围包装一个互斥对象,但是在我实际需要它之后很久,我还是要为同步开销付费。另一种选择是
static Foo &getInst()
{
static Foo *inst = NULL;
if(inst == NULL)
{
pthread_mutex_lock(&mutex);
if(inst == NULL)
inst = new Foo(...);
pthread_mutex_unlock(&mutex);
}
return *inst;
}
这样做对吗,还是有什么我需要注意的陷阱?例如,是否存在任何可能发生的静态初始化顺序问题,即在第一次调用 getInst 时 inst 总是保证为 NULL?