单例模式

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 @ 2023-09-15 12:06  SusieSnail_SUN  阅读(4)  评论(0编辑  收藏  举报