单例模式

复制代码
Analyser* Analyser::Instance()
{
    static QMutex mutex;
    static QScopedPointer<Analyser> inst;
    if (Q_UNLIKELY(!inst)) {
        mutex.lock();
        if (!inst) {
            inst.reset(new Analyser);
        }
        mutex.unlock();
    }
    return inst.data();
}
复制代码

上面是一个单例模式的实现。它确保在应用程序中只有一个Analyser对象的实例,并提供了一个全局访问点来获取该实例。

代码中使用了双重检查锁定机制来实现线程安全的单例。首先,它使用静态局部变量inst来保存Analyser对象的实例。在第一次调用Instance()方法时,inst为空,进入if (Q_UNLIKELY(!inst))的条件判断。

在进入条件判断后,使用QMutex来加锁,确保只有一个线程进入临界区。然后再次检查inst是否为空,这是为了避免多个线程同时通过第一个条件判断,然后同时创建多个实例。

如果inst为空,说明没有其他线程在创建实例,此时通过inst.reset(new Analyser)创建一个新的Analyser对象,并将其赋值给inst。然后解锁mutex,并返回inst.data(),即Analyser对象的指针。

如果inst不为空,说明已经有其他线程在创建实例,此时直接返回inst.data(),即已经存在的Analyser对象的指针。

通过这种方式,可以保证在多线程环境下只有一个Analyser对象的实例,并且在实例创建过程中保证线程安全。

posted @   SusieSnail_SUN  阅读(6)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
点击右上角即可分享
微信分享提示