Meyers单例线程安全与C ++-98

leo*_*n22 1 c++ singleton multithreading visual-studio-2008 c++98

目前,我已经实现了迈耶单例的这一实现:

class ClassA
{
public:
    static ClassA& GetInstance()
    {                   
        static ClassA instance;     
        return instance;
    }   

private:
    ClassA::ClassA() {};

    // avoid copying singleton
    ClassA(ClassA const&);
    void operator = (ClassA const&);
};
Run Code Online (Sandbox Code Playgroud)

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

谢谢!

PS:目前尚不清楚?您会看到标签visual-studio-2008和c ++-98->,因此目标操作系统是Windows!我也不明白为什么我只被某些人完全不喜欢辛格尔顿一家的人投票!

Jam*_*nze 5

通常,Meyer单例并不是最佳的解决方案,尤其是在多线程环境中。实现单例的更通用方法是:

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

并在源文件中:

ClassA* ClassA::ourInstance = &instance();

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

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