5,530
社区成员
发帖
与我相关
我的任务
分享
#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);
}
#include<windows.h>
#include <iostream>
using namespace std;
template<typename T>
class Singleton
{
public:
static T& Instance()
{
static T& sg = MakeInstance();
return sg;
}
protected:
static T& MakeInstance()
{
static T* p;
static LONG Lock;
static int num;
static CRITICAL_SECTION cs;
while (InterlockedExchange(&Lock, 1) == 1) //旋转锁
Sleep(0);
if (!num) //如果是第一个
{
InitializeCriticalSection(&cs); //初始化关键段
++num;
}
InterlockedExchange(&Lock, 0); //开锁
if (!p)
{
EnterCriticalSection(&cs);
p = new T(); //创建T
LeaveCriticalSection(&cs);
}
while (InterlockedExchange(&Lock, 1) == 1) //旋转锁
Sleep(0);
--num;
if (!num) //如果是最后一个从关键段出来的进程.
{
DeleteCriticalSection(&cs); //销毁关键段.
}
InterlockedExchange(&Lock, 0); //开锁
return *p;
}
Singleton() {}
Singleton(const Singleton&){}
~Singleton(){}
};
class SingleA: public Singleton<SingleA> //一个具体的单件类.
{
friend Singleton;
SingleA()
{
cout<<"Hello SingleA"<<endl;
}
};
int main()
{
SingleA& s1=SingleA::Instance();
SingleA& s2=SingleA::Instance();
}