【发布时间】:2012-08-12 09:23:04
【问题描述】:
我一直在阅读有关线程安全单例的信息,我发现到处都有一个 getInstance() 方法,如下所示:
Singleton* getInstance()
{
if ( !initialized )
{
lock();
if ( !initialized )
{
instance = new Singleton();
initialized = true;
}
unlock();
}
return instance;
}
- 这实际上是线程安全的吗?
- 我是否遗漏了什么,或者该函数返回未初始化实例的可能性很小,因为“已初始化”可能会被重新排序并设置在实例之前?
这篇文章的主题略有不同,但最佳答案描述了为什么我认为上述代码不是线程安全的:
Why is volatile not considered useful in multithreaded C or C++ programming?
【问题讨论】:
-
不,它不是线程安全的。而且,好吧,如果你使用单例,那么你就会得到你想要的,真的。
-
或者简而言之,不是您错过了什么,而是该代码的作者。但是我想知道实例分配和初始化分配之间的内存障碍是否可以解决问题(假设初始化的类型为
volatile sig_atomic_t)。 -
记忆障碍也是我的想法。
标签: c++ multithreading design-patterns thread-safety singleton