您的位置:首页 > 编程语言 > C语言/C++

[C++设计模式] singleton 单例模式

2015-06-23 17:46 363 查看
这个设计模式主要目的是想在整个系统中只能出现一个类的实例。这样做当然是有必然的,比如你的软件的全局配置信息,或者是一个Factory,或是一个主控类,等等。你希望这个类在整个系统中只能出现一个实例。

一、调用pthread_once()实现了一个线程安全的版本:


pthread_once()函数详解

代码:

template <class T>
class Singleton
{
public:
static T& instance()
{
pthread_once(&ponce_,&Singleton::init);
return *value_;
}
static void init()//加了一层封装,适应不同类型的初始化函数
{
value_ = new T();
}
private:
Singleton();
~Singleton();
static pthread_once_t ponce_;
static T * value_;
};
template <class T>
pthread_once_t Singleton<T>::ponce_=PTHREAD_ONCE_INIT;//Linux下初始化为0;

template <class T>
T* Singleton<T>::value_=NULL;


二、双重检查加锁法

class Singleton
{
public:
static Singleton *GetInstance()
{
if (m_Instance == NULL )
{
Lock lock; // Lock为管理互斥锁的资源类,会在该函数退出时自动释放
if (m_Instance == NULL )
{
m_Instance = new Singleton ();
}

}
return m_Instance;
}

static void DestoryInstance()
{
if (m_Instance != NULL )
{
delete m_Instance;
m_Instance = NULL ;
}
}

int GetTest()
{
return m_Test;
}

private:
Singleton(){ m_Test = 0; }
static Singleton *m_Instance;
int m_Test;
};

Singleton *Singleton ::m_Instance = NULL;


双重检查加锁的优势在于:

(1)没有实例化Singleton时,所有调用静态函数GetInstance的线程都会阻塞在lock上,只有第一个调用者能获取该lock,实例化该类。

(2)已经实例化Singleton时,所有调用者线程就不用排队获取lock,直接获取实例化对象
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: