#incldue<iostream>
#include<mutex>
using namespace std;
class CSingleton
{
public:
static CSingleton* GetCSingleton()
{
if (_p == NULL)
{
//_mutex.lock();
unique_lock<mutex> lock(_mutex);
if (_p == NULL)
{
_p = new CSingleton;
}
//_mutex.unlock();
}
return _p;
}
private:
static CSingleton* volatile _p;
static mutex _mutex;
CSingleton(){}
};
CSingleton* volatile CSingleton::_p = NULL;
mutex CSingleton::_mutex;
int main()
{
CSingleton *p = CSingleton::GetCSingleton();
return 0;
}
静态局部变量初始化不需要加锁,自动线程安全
两次instance == NULL的判断不可少。才能保证多线程安全,这种方法也叫Double-Check Locking(双重锁定)