C++线程安全的单例模式
首先看一下普通的单例模式实现:
class singleton{
public:
static singleton* getinstance(){
if(p==null){
p = new singleton();
}
return p;
}
protect:
singleton(){}
private:
static singleton* p;
}
简单的单例模式就是这样,不过想象两个进程同时调用getinstance() 会同时生成两个实例对象这就不符合单例模式的初衷了,所以需要加上锁
如下:
class singleton{
public:
static singleton* getinstance(){
if(p==null){
thread_mutex_lock(&mutex);
if(p==null){
p = new singleton();
}
thread_mutex_unlock(&mutex);
}
return p;
}
protect:
singleton(){}
private:
static singleton* p=NULL;
static thread_mutex_t mutex;
}
这样就实现了线程安全的单例模式
注意之所以要判断两次p是因为每次getinstance()都会加锁导致效率很低 所以加一个判断提高效率