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

来源:互联网 发布:uu淘宝店 编辑:程序博客网 时间:2024/06/03 22:41

#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上提示找不到头文件。

原创粉丝点击