template<class T>
class Singleton
{
public:
static T& Instance()
{
static m_instance;
return &m_instance;
}
Singleton(Singleton& instance) = delete;
Singleton& operator=(Singleton& instance) = delete;
protected:
Singleton();
~Singleton();
private:
T m_instance;
}
构造函数非公有,保证实例不会被随意创建,局部静态函数给外界提供一个接口获取Singleton对象,局部静态成员保证m_instance实例只有一个,且该局部静态成员变量会延迟到Instance函数被调用时才被实例化。
为了单例子的可重用,将Singleton申明为模板类型template。
因为默认的拷贝构造函以及赋值构造函数均为位拷贝,即浅拷贝,故禁用掉默认拷贝构造函以及赋值构造函数。
Singleton(Singleton& instance) = delete;
Singleton& operator=(Singleton& instance) = delete;
上述代码存在一个多线程安全问题——因静态成员变量m_instance是延时初始化,在多线程中,同时调用 Instance()函数会存在,第一个线程还未实例化完毕,第二个线程接着实例子话,所以个人建议在进程刚进入时,就执行单例实例化函数 Instance()。
线程安全
上述代码中static变量的初始化并不是原子操作,一般编译器会用一个全局的bool标志判断static是否被初始化。基本步骤如下:
bool flag = false;
if(!flag)
{
//static变量初始化
flag = true;
}
因此, 除了用户手动提前执行单例实例化函数Instance以外,通过以下方式实现Singleton的多线程安全。
#include<mutex>
#include<atomic>
using namespace std;
template<class T>
class SafeSingle
{
public:
static T& Instance()
{
if(!m_instance)
{
lock_guard<mutex> locker(m_mutex);
if(!m_instance)
{
m_instance = new SafeSingle()
atexit(Destory);
}
return m_instance;
}
return m_instance;
}
protected:
SafeSingle();
~SafeSingle();
private:
void Destory()
{
if(m_instance)
{
delete m_instance;
}
m_instance = NULL;
}
static atomic<T*> m_instance;
mutex m_mutex;
};
转载:http://www.cnblogs.com/loveis715/archive/2012/07/18/2598409.html