单例模式分为“饥汉”和“饿汉”两种版本,也正是线程安全问题使得原本简单的单例模式变得复杂。由于单例模式很常用,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。*/
};