实现
#pragma once
#include <windows.h>
/*
使用临界区来枷锁和解锁
*/
class LockBase
{
private:
// Singleton是LockBase友元,在Singleton类内部可以访问LockBase的私有成员
friend class Singleton;
CRITICAL_SECTION cs;
void lock()
{
EnterCriticalSection(&cs);
}
void unlock()
{
LeaveCriticalSection(&cs);
}
public:
LockBase()
{
InitializeCriticalSection(&cs);
}
~LockBase()
{
DeleteCriticalSection(&cs);
}
};
class Singleton
{
private:
static Singleton* instance;
Singleton(){}
public:
static Singleton* getInstance()
{
// 使用双重检验枷锁机制
if (NULL == instance)
{
LockBase* lockBase = new LockBase();
lockBase->lock();
if (NULL == instance)
{
instance = new Singleton();
}
lockBase->unlock();
}
return instance;
}
};
// 注意C++中静态变量在类内是声明,在类外是定义
Singleton* Singleton::instance = NULL;
测试
#include "Singleton.h"
#include <iostream>
using namespace std;
int main()
{
Singleton* s1 = Singleton::getInstance();
Singleton* s2 = Singleton::getInstance();
if (s1 == s2)
{
cout << "s1 和 s2 指向是同一个对象" << endl;
}
return 0;
}
注意
注意代码的细节,注意C++中静态变量的定义是在类外。