单例模式分为“饥汉”和“饿汉”两种版本,也正是线程安全问题使得原本简单的单例模式变得复杂。由于单例模式很常用,Boost库中有强大的泛型单例实现,我也利用Qt的原子指针QAtomicPointer来实现Qt中的单例模式:

//.cpp
class SingleTon
{
 
public:
    /*! \brief 用于获得SingleTon实例,使用单例模式。
     *  \return SingleTon实例的引用。
     */
    static SingleTon &getInstance(void)
    {
        //使用双重检测。
 
        if(!instance)//第一次检测
        {
            QMutexLocker locker(&mutex);//加互斥锁。
 
            if(!instance)//第二次检测。
                instance = new SingleTon;
        }
 
        return *instance;
    }
 
private:
    SingleTon();//禁止构造函数。
    SingleTon(const SingleTon &);//禁止拷贝构造函数。
    SingleTon & operator=(const SingleTon &);//禁止赋值拷贝函数。
 
    QReadWriteLock internalMutex;//函数使用的读写锁。
 
    static QMutex mutex;//实例互斥锁。
    static QAtomicPointer<SingleTon> instance;/*!<使用原子指针,默认初始化为0。*/
};

相关文章: