单例模式
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对象的实例,并且在实例创建过程中保证线程安全。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人