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对象的实例,并且在实例创建过程中保证线程安全。
标签:mutex,模式,实例,线程,单例,inst,Analyser From: https://www.cnblogs.com/susiesnai-sun/p/17704744.html