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

这样的单件模式是线程安全的吗?
在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;
}


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