C ++中的线程安全单例

时间:2012-08-12 09:23:05

标签: c++ multithreading design-patterns thread-safety singleton

我一直在阅读关于线程安全的单例,我发现在各处都有一个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?

2 个答案:

答案 0 :(得分:4)

答案 1 :(得分:0)

它确实不是线程安全的,因为在指针返回后你仍然使用它,尽管互斥锁再次被解锁。

你可以做的是使子类继承自单例,线程安全。然后你很高兴。