C++ C+中的线程安全单例+;

C++ C+中的线程安全单例+;,c++,multithreading,design-patterns,thread-safety,singleton,C++,Multithreading,Design Patterns,Thread Safety,Singleton,我一直在读线程安全的单例,我在everywhere找到的实现有一个getInstance()方法,类似这样: Singleton* getInstance() { if ( !initialized ) { lock(); if ( !initialized ) { instance = new Singleton(); initialized = true; }

我一直在读线程安全的单例,我在everywhere找到的实现有一个getInstance()方法,类似这样:

Singleton* getInstance()
{
    if ( !initialized )
    {
        lock();
        if ( !initialized )
        {
            instance = new Singleton();
            initialized = true;
        }
        unlock();
    }

    return instance;
}
  • 这真的是线程安全的吗
  • 我是否遗漏了什么,或者该函数返回未初始化实例的可能性很小,因为“initialized”可能会在实例之前重新排序和设置
本文的主题稍有不同,但最上面的答案描述了我认为上述代码不是线程安全的原因:


这不是个好主意。寻找双重检查锁定。例如:


这不是个好主意。寻找双重检查锁定。例如:


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


您可以做的是使继承自singleton的子类成为线程安全的。然后就可以开始了。

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


您可以做的是使继承自singleton的子类成为线程安全的。那你就可以走了。

不,这不是线程安全的。如果你使用单例,你会得到你想要的,真的。或者简言之,不是你错过了什么,而是你错过了代码的作者。但是,我想知道,在赋值实例和初始化赋值之间是否存在内存障碍会影响问题(假设初始化为类型<代码>易失性SiguAuthiCixt < /代码>)。考虑复习:记忆障碍也是我的想法。不,它不是线程安全的。如果你使用单例,你会得到你想要的,真的。或者简言之,不是你错过了什么,而是你错过了代码的作者。但是,我想知道,在实例赋值和初始化赋值之间是否存在内存障碍会影响问题(假设初始化为类型<代码>易失性SiguAuthiCixt < /代码>)。考虑复习:记忆障碍也是我的想法。两个优秀的程序员。谢谢你发布这些。两篇优秀的文章。谢谢你发布这些。