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

本文介绍了一个线程安全的C++单例模式实现,通过双重检查锁定机制确保了实例创建的唯一性和线程安全性。文章详细展示了如何使用互斥锁(mutex)来保护单例对象的创建过程。

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值