读书人

这样的单件模式是线程安全的吗?该怎么

发布时间: 2012-03-19 22:03:05 作者: rapoo

这样的单件模式是线程安全的吗?
在vs2008下编译.

以下的代码是线程安全的吗?

C/C++ code
#include<windows.h>#include <iostream>using namespace std;CRITICAL_SECTION g_cs;template<typename T>class Singleton{    public:     static T& Instance()    {         static T& sg = MakeInstance();         return sg;    }protected:    static T& MakeInstance()    {        EnterCriticalSection(&g_cs);        static T& sg = T();            LeaveCriticalSection(&g_cs);        return sg;     }    Singleton()    {}    Singleton(const Singleton&){}    ~Singleton(){}};class SingleA: public Singleton<SingleA>        //一个具体的单件类.{    friend Singleton;        SingleA()    {        cout<<"Hello SingleA"<<endl;    }};int main(){        InitializeCriticalSection(&g_cs);    SingleA& s1=SingleA::Instance();    SingleA& s2=SingleA::Instance();        DeleteCriticalSection(&g_cs);}


[解决办法]
当然不是线程安全的,而是直接彻底错误的。
因为全局对象的构造里可以创线程,而这时还没执行到main呢。
[解决办法]
参考拙作:
C++实现Singleton模式

有非常详细的说明。
[解决办法]

static T& Instance()
{
static T& sg = MakeInstance();
return sg;
}


这个,每次都去实例化一个阿^
[解决办法]
有一种单件叫线程单件,就是每个线程有一份自己的拷贝。

读书人网 >C++

热点推荐