您的位置:首页 > 运维架构 > Linux

linux下一个C++线程安全的单例模式

2017-09-09 11:06 260 查看
#include <iostream>
#include <stdio.h>
#include <pthread.h>//pthread.h是在linux编程环境下才有的,以至于在visual studio 2010上提示找不到头文件

using namespace std;

class Singleton
{
private:
static Singleton* m_instance;
static pthread_mutex_t mutex;
Singleton() {}
public:
static Singleton* getInstance();//单例模式中只有getInstance()方法才是public的,互斥锁mutex,构造函数,单例变量都应该是private的
};

Singleton* Singleton::m_instance=NULL;//注意static变量,static函数只能调用static变量,所以mutex,m_instance都应该是static成员,并且static非const成员不可在类内定义,需要在全局变量中声明,不然棕色会提示 undefined reference to 
pthread_mutex_t Singleton::mutex;
Singleton* Singleton::getInstance(){
if(m_instance==NULL){
pthread_mutex_lock(&mutex);//为保证线程安全,需要双重锁的机制实现
if(m_instance==NULL){
m_instance=new Singleton();
}
pthread_mutex_unlock(&mutex);
}
return m_instance;
};

int main(){
Singleton *s1=Singleton::getInstance();
Singleton *s2=Singleton::getInstance();
if(s1==s2){
cout<<"s1==s2"<<endl;
}else{
cout<<"s1!=s1"<<endl;
}
return 0;
}


一个线程安全的C++单例模式 

注意事项: 

1.单例模式中只有getInstance()方法才是public的,互斥锁mutex,构造函数,单例变量都应该是private的。 

2.注意static变量,static函数只能调用static变量,所以mutex,m_instance都应该是static成员,并且static非const成员不可在类内定义,需要在全局变量中声明,不然棕色会提示 undefined reference to 

3.为保证线程安全,需要双重锁的机制实现。 

4.头文件中的pthread.h是在linux编程环境下才有的,以至于在visual studio 2010上提示找不到头文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: