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

时间:2013-07-29 12:55:38

标签: c++ multithreading visual-studio-2008 singleton c++98

目前我有meyer singleton的实现:

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!我也不明白为什么我只是投票,一些人根本不喜欢辛格尔顿!

1 个答案:

答案 0 :(得分:4)

迈耶单身人士一般不是最好的解决方案 特别是在多线程环境中。更一般的 实现单身人士的方式是:

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(应该是这种情况),而且不是动态的 加载(如果对象是,也应该是这种情况 是唯一的,可以从静态的构造函数访问 对象,然后它必须是他们的静态构造函数 跑)。它还具有避免任何顺序的优点 破坏问题。