C++简洁完美的单例模式实现
2019-04-02 本文已影响0人
Jozhn
完美的单例模式是线程安全的,使用懒汉模式。
Lock类用于加锁解锁,Singleton类为单例类。
不过还可能出现问题,因为CPU可能乱序执行,会出现未定义行为导致段错误:
假如线程A进入锁内并分配对象的空间,但是由于指令可能乱序,实际上导致local_instance被先指向一块未被分配的内存,然后再在这块内存上进程初始化。但是在指向后,未初始化前,另一线程B可能通过getInstance获取到这个指针。
#include <iostream>
#include <mutex>
using namespace std;
class Lock
{
private:
mutex mtx;
public:
void lock(){mtx.lock();}
void unlock(){mtx.unlock();}
};
class Singleton
{
private:
Singleton(){};
static Lock* locker;//静态锁对象指针
static Singleton* instance;//静态单例对象指针
public:
static Singleton* getInstance()
{
if(!instance)
{
locker->lock();
if(!instance)
{
instance = new Singleton;
}
locker->unlock();
}
return instance;
};
};
// 初始化锁
Lock* Singleton::locker = new Lock();
// 初始化单例
Singleton* Singleton::instance = 0;
int main()
{
Singleton *s1 = Singleton::getInstance();
Singleton *s2 = Singleton::getInstance();
cout << s1 << endl;
cout << s2 << endl;
return 0;
}