详解 Qt 中实现单例模式
来源:互联网 发布:柬埔寨网络博客推广 编辑:程序博客网 时间:2024/09/21 09:02
详解 Qt 中实现单例模式
本文介绍的是Qt 中实现单例模式,由于单例模式很常用,Boost库中有强大的泛型单例实现,先来看内容。
Qt 中实现单例模式是本文要介绍的内容,不多说,先来看内容。单例模式分为“饥汉”和“饿汉”两种版本,也正是线程安全问题使得原本简单的单例模式变得复杂。由于单例模式很常用,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。*/
- };//静态成员变量初始化。(在.cpp文件中)
QMutex SingleTon::mutex;QAtomicPointer<SingleTon> SingleTon::instance = 0;
双重锁检测在C++中是安全的,另外提供了读写锁,在修改单例数据的函数中使用写锁(QWriteLocker locker(&internalMutex););在读取单例数据的函数中使用读锁(QReadLocker locker(&internalMutex);)。
之前没考虑到乱序执行问题,并且此前代码有严重BUG,即对QAtomicPointer类型变量赋值操作不是原子操作,见官方文档:
For convenience, QAtomicPointer provides pointer comparison, cast, dereference, and assignment operators. Note that these operators are not atomic.
修改代码,使用testAndSetOrdered原子操作,并解决乱序执行问题,testAndSetOrdered特性:
This function uses ordered memory ordering semantics, which ensures that memory access before and after the atomic operation (in program order) may not be re-ordered.
其中关于memory ordering,我转过此帖:http://www.cnblogs.com/codingmylife/archive/2010/04/28/1722573.html
其中关于double checked locking,有此文:http://docs.huihoo.com/ace_tao/lifecycle.html
修改版SingleTon.cpp:
- //.cpp 一次修改版
- class
- SingleTon{ public
- : /*! \brief 用于获得SingleTon实例,使用单例模式。
- * \return SingleTon实例的引用。
- */
- static
- SingleTon &getInstance(void
- ) { #ifndef
- Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE if
- (!QAtomicPointer::isTestAndSetNative())//运行时检测
- qDebug() << "Error: TestAndSetNative not supported!"
- ;#endif
- //使用双重检测。
- /*! testAndSetOrders操作保证在原子操作前和后的的内存访问
- * 不会被重新排序。
- */
- if
- (instance.testAndSetOrdered(0, 0))//第一次检测
- { QMutexLocker locker(&mutex);//加互斥锁。
- instance.testAndSetOrdered(0, new
- SingleTon);//第二次检测。
- } return
- *instance; } private
- : SingleTon();//禁止构造函数。
- SingleTon(const
- SingleTon &);//禁止拷贝构造函数。
- SingleTon & operator
- =(const
- SingleTon &);//禁止赋值拷贝函数。
- QReadWriteLock internalMutex;//函数使用的读写锁。
- static
- QMutex mutex;//实例互斥锁。
- static
- QAtomicPointer<SingleTon> instance;/*!<使用原子指针,默认初始化为0。*/
- };
小结:详解Qt 中实现单例模式的内容介绍完了,希望本文对你有帮助!
- 详解 Qt 中实现单例模式
- Qt中实现单例模式(SingleTon)
- Qt中实现单例模式(SingleTon)
- QT单例模式的宏实现
- 单例模式(Qt实现)
- qt中简单的单例模式
- <Linux+Qt>使用Qt实现单例模式
- qt 单例模式
- Qt-单例模式
- Qt-单例模式
- qt 单例模式
- Qt单例模式
- 单例模式4种实现详解
- 单例模式--各种实现方式详解
- qt 实现单例
- Qt:让程序实现单例模式,只能打开一次
- Objective C 中实现单例模式
- C++中实现单例模式
- 详解 Android 的 Activity 组件
- Linux 下的线程读写锁
- POJ 2186 Popular Cows
- Eclipse 安装Maven插件
- Photoshop--loadlibrary failed with error 126:找不到指定模块
- 详解 Qt 中实现单例模式
- QtConcurrent
- QT——QThread线程类
- QT——QMutex(互斥量)
- QT——QReadWriteLock
- QT——QSemaphore(信号量)
- QT——QWaitCondition
- QT——qt总结
- QT——QSettings保存程序窗口状态