【发布时间】:2017-04-08 10:29:42
【问题描述】:
我知道线程安全单例的常见实现是这样的:
Singleton* Singleton::instance() {
if (pInstance == 0) {
Lock lock;
if (pInstance == 0) {
Singleton* temp = new Singleton; // initialize to temp
pInstance = temp; // assign temp to pInstance
}
}
return pInstance;
}
但是为什么他们说它是线程安全的实现呢?
例如,第一个线程可以通过pInstance == 0 上的两个测试,创建new Singleton 并将其分配给temp 指针,然后开始 分配pInstance = temp(据我所知,指针赋值操作不是原子的)。
同时,第二个线程测试第一个pInstance == 0,其中pInstance 只分配了一半。它不是 nullptr 但也不是有效指针,然后从函数返回。
这样的情况会发生吗?我在任何地方都没有找到答案,似乎这是一个非常正确的实现,我什么都不懂
【问题讨论】:
-
从C++11开始,线程安全单例的常见实现看起来像
static Singleton s; return s; -
最简单的解决方案是在其他线程启动之前在主线程中显式创建所有单例,因为更复杂的解决方案实现的延迟初始化通常无论如何都是过度设计的。或者干脆不要使用单例。
标签: c++ multithreading singleton double-checked-locking