Meyers Singleton线程安全与C++-98

Meyers Singleton thread safe with C++-98

本文关键字:C++-98 安全 线程 Singleton Meyers      更新时间:2023-10-16

目前我有meyer单例的实现:

class ClassA
{
public:
    static ClassA& GetInstance()
    {                   
        static ClassA instance;     
        return instance;
    }   
private:
    ClassA::ClassA() {};
    // avoid copying singleton
    ClassA(ClassA const&);
    void operator = (ClassA const&);
};

现在,我需要一些改进来确保C++-98和VS-2008中的代码线程安全?!

谢谢!

PS:什么不清楚?你可以看到标签visual-studio-2008和c++-98->所以目标操作系统是Windows!我也不明白为什么我被投票否决了——有些人根本不喜欢辛格尔顿的!

Meyer单例并不是最好的解决方案,而且尤其是在多线程环境中。更一般的实现单例的方法是:

class ClassA
{
    static ClassA* ourInstance;
    //  ctor's, etc.
public:
    static ClassA& instance();
};

并且在源文件中:

ClassA* ClassA::ourInstance = &instance();
// This can be in any source file.
ClassA&
ClassA::instance()
{
    if ( ourInstance == NULL ) {
        ourInstance = new ClassA;
    }
    return *ourInstance;
}

如果在进入前没有创建线程,则这是线程安全的main(应该是这种情况),并且它不是动态的已加载(如果对象要是唯一的,并且可以从static的构造函数访问对象,则当静态构造函数运行)。它还具有避免任何顺序破坏问题。