您的当前位置:首页线程安全单例模式(C++)
线程安全单例模式(C++)
来源:锐游网
线程安全单例模式(C++)
饿汉模式
#include<iostream>
using namespace std;
class Singleton
{
public:
static Singleton *GetInstance()
{
return m_pInstance;
}
private:
static Singleton *m_pInstance;
Singleton() { cout << "Singleton()" << endl; };
~Singleton() { cout << "~Singleton()" << endl; };
class Garbo /* Garbo意为垃圾工人,任务是在 Singleton 实例生命周期结束后(即进程即将结束)回收该实例 */
{
public:
~Garbo()
{
if(Singleton::m_pInstance)
delete m_pInstance;
}
};
static Garbo garbo;
};
Singleton::Garbo Singleton::garbo; /* 一定要初始化,否则程序结束时不会调用~Garbo() */
Singleton *Singleton::m_pInstance = new Singleton; /* main函数之前就生成一个实例 */
int main(void)
{
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();
if(p1 == p2)
{
cout << "p1 == p2" << endl;
}
return 0;
}
$ g++ Singleton.cpp -o Singleton
$ ./Singleton
Singleton()
p1 == p2
~Singleton()
懒汉模式
懒汉模式:即第一次调用该类实例的时候才产生一个新的该类实例,并在以后仅返回此实例。
需要用锁,来保证其线程安全性:原因:多个线程可能进入判断是否已经存在实例的if语句,从而非线程安全.
使用double-check来保证线程安全.但是如果处理大量数据时,该锁才成为严重的性能瓶颈。
#include<iostream>
#include<pthread.h>
using namespace std;
pthread_mutex_t mutex;
class Singleton
{
public:
static Singleton *GetInstance()
{
if(NULL == m_pInstance)
{
pthread_mutex_lock(&mutex);
if(m_pInstance == NULL)
m_pInstance = new Singleton;
pthread_mutex_unlock(&mutex);
}
return m_pInstance;
}
private:
static Singleton *m_pInstance;
Singleton() { cout << "Singleton()" << endl; }
~Singleton() { cout << "~Singleton()" << endl; }
class Garbo
{
public:
~Garbo()
{
if(m_pInstance)
delete m_pInstance;
}
};
static Garbo garbo;
};
Singleton::Garbo Singleton::garbo; /* 静态类成员初始化 */
Singleton *Singleton::m_pInstance = NULL; /* 静态类成员初始化 */
int main(void)
{
pthread_mutex_init(&mutex, NULL);
Singleton *p1 = Singleton::GetInstance();
Singleton *p2 = Singleton::GetInstance();
if(p1 == p2)
cout << "p1 == p2" << endl;
pthread_mutex_destroy(&mutex);
return 0;
}
$ g++ Singleton.cpp -o Singleton
$ ./Singleton
Singleton()
p1 == p2
~Singleton()
因篇幅问题不能全部显示,请点此查看更多更全内容