如何写一个C++的安全单例模板类

6 篇文章 0 订阅
3 篇文章 0 订阅
本文介绍了C++模板类SingletonTemplate的实现,使用了静态成员和线程锁确保线程安全。通过实例化和析构函数管理单例对象,同时提供getInstance()和freeInstance()方法获取或释放实例。
摘要由CSDN通过智能技术生成

template<class T>
class SingletonTemplate
{
public:
    static T *getInstance();
    static void freeInstance();

protected:
    SingletonTemplate(){}
    ~SingletonTemplate(){}

private:
    SingletonTemplate(const SingletonTemplate&);
    SingletonTemplate &operator=(const SingletonTemplate&);

private:
    static QMutex m_cMutex;  //线程锁
    static T *m_pInstance;  //单例对象
};

 

//定义 初始化 单例信息

template<class T>
QMutex SingletonTemplate<T>::m_cMutex;

template<class T>
T *SingletonTemplate<T>::m_pInstance = nullptr;

template<class T>
T *SingletonTemplate<T>::getInstance()
{
    if (!m_pInstance)
    {
        QMutexLocker qMLocker(&m_cMutex);  //线程安全,加个锁
        if (!m_pInstance)
        {
            m_pInstance = new T();
            ::atexit(freeInstance);  //注册终止函数
        }        
    }

    return m_pInstance;
}

template<class T>
void SingletonTemplate<T>::freeInstance()
{
    if (!m_pInstance)
    {
        QMutexLocker qMLocker(&m_cMutex);  //线程安全,加个锁
        if (!m_pInstance)
        {
            delete m_pInstance;   //释放单例
            m_pInstance = nullptr;
        }        
    }
}

线程安全单例模式是一种在多线程环境下确保只有一个实例被创建的设计模式。在实际使用中,有时需要保证某个类的对象在整个应用程序中只能有一个实例存在,并且该实例在任何时候都能被访问和使用。 线程安全单例模板的实现一般包含以下几个要点: 1. 构造器私有化:通过将类的构造函数私有化,可以防止在类外部直接实例化对象。 2. 静态成员对象:在类内部创建一个私有的静态成员对象,用于存储类的唯一实例。 3. 全局访问方法:通过提供一个公共的静态方法,来获取类的唯一实例。在该方法内部进行实例化操作,保证只有一个实例被创建。 4. 线程安全性:由于多线程环境下会有多个线程同时访问该方法,需要考虑线程安全问题。可以通过加锁机制,或者使用双重检查锁定(double-checked locking)来保证线程安全。 双重检查锁定是一种常用的实现方式,具体步骤如下: 1. 在全局访问方法内进行第一次判断,检查实例是否已经被创建。 2. 若实例为空,则进行同步锁定,防止其他线程同时进入。 3. 在同步块内再次检查实例是否为空,如果为空则进行实例化。 4. 返回实例。 这样可以确保在多线程环境下,只有一个实例被创建,同时保证访问的效率和线程安全性。 总之,线程安全单例模板是一种重要的设计模式,它可以保证在多线程环境下只有一个实例存在,并且正常进行访问。通过适当的加锁机制,可以确保线程安全性,保护对象的一致性和可靠性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值