Qt实现简单的单例模式

Qt实现简单的单例模式

单例模式十分的常见也很常用,Boost库中就有单例的泛型实现,Qt中,可以利用原子指针来实现一个单例模式:

 1 class SingleTon{
 2 public:
 3     static SingleTon &getInstance(void)
 4     {
 5         //双重检测加锁
 6         if(!instance){
 7             QMutexLocker locker(&mutex);
 8             if(!instance)
 9                 instance = new SingleTon;
10         }
11         return * instance;
12     }
13 private:
14     SingleTon();
15     SingleTon(const SingleTon & );
16     SingleTon & operator = (const SingleTon &);
17     QReadWriteLock internalMutex;
18     static QMutex mutex;
19     static QAtomicPointer<SingleTon> instance;
20 };
21 
22 //初始化静态变量
23 QMutex SingleTon::mutex;
24 QAtomicPointer<SingleTon> SingleTon::instance = 0;

在上面的单例中,除了原子锁之外,另外还提供了读写锁,以供在需要读(QReadLocker(&internalMutex))或者写(QWriteLock(&internalMutex))的成员函数中去使用。

上面的例子看起来好像没什么问题,但是实际上Qt提供的原子锁在乱序执行的情况下的时候提供的实际上并不是原子操作,下面对其做一些修改:

 1 class SingleTon{
 2 public:
 3     static SingleTon &getInstance(void)
 4     {
 5 #ifdef Q_ATOMIC_POINTER_TEST_AND_SET_IS_ALWAYS_NATIVE
 6         if(!QAtomicPointer::isTestAndSetNative())//运行时进行检测
 7             qDebug() << "Error: don's support TestAndSetNative!!!!!!"
 8 #endif
 9         //双重检测加锁
10         if(instance.testAndSetOrdered(0,0)){
11             QMutexLocker locker(&mutex)
12             instance.testAndSetOrdered(0, new SingleTon);
13         }
14         return * instance;
15     }
16 private://下与上相同
17     SingleTon();
18     SingleTon(const SingleTon &);
19     SingleTon & operator=(const SingleTon &);
20     QReadWriteLock internalMutex;
21     static QMutex mutex;
22     static QAtomicPointer<SingleTon> instance;
23 };

上面才是原子指针的正确使用方法。关于双重检测加锁的问题,可以见这篇文章

 

 

转载于:https://www.cnblogs.com/-wang-cheng/p/5052588.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/109204.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Flash停止支持?不用愁!![通俗易懂]

    Flash停止支持?不用愁!![通俗易懂]2020年的最后一天,Flash华丽谢幕与我们告别……作为一名4399的忠实玩家,真是心痛不已……所以,今天告诉大家几种让Flash重新工作的方式:1.安装“中国版Flash”:目前,中国已经

    2022年8月1日
    9
  • Java明星HD_javaHDvideo[通俗易懂]

    Java明星HD_javaHDvideo[通俗易懂]简介:javaHDvideo洪三摇头:“不在虎威赌坊,毕竟赌王盛会在华夏有些敏感,其实每年的中秋,虎王都会举办赌王大会,届时江宁江湖道上,有头有脸的人物都会参加,地点就在公海的游轮上。”崆峒派两名弟子嘿嘿笑道:“想不到你小子倒还有点自知之明。”“你……”铁无痕咬牙切齿。面对这几人相互挖苦嘲讽,唐锋不由摇了摇头,不过却是懒得搭理,当下抬头看向主席台道:“在接受挑战之前,在下有一个问题。”陆展鹏仍旧还…

    2022年7月7日
    19
  • 如何给女朋友做个树莓派复古相机?[通俗易懂]

    如何给女朋友做个树莓派复古相机?[通俗易懂]本文转载自程序员极客实验室手机拍照不够爽,带个单反又太重?试试做个树莓派复古相机,还能自己编写处理算法的那种——成本不到700元。没错,颜值很高,拍出来的照片也能打:你也可以快速上手做一个。如何制作一个树莓派复古相机目前,这部相机的代码、硬件清单、STL文件(用于3D打印)和电路图都已经开源。首先是硬件部分。这部复古相机的硬件清单如下:树莓派ZeroW(搭配microSD卡)、树莓派高清镜头模组、16mm1000万像素长焦镜头、2.2英寸TFT显

    2022年5月27日
    35
  • Oracle中的NULL、’’(空字符串)以及’_’(空格)

    Oracle中的NULL、’’(空字符串)以及’_’(空格)

    2021年9月12日
    135
  • python获取股票历史数据_量化交易之如何获取股票历史数据并存为csv

    python获取股票历史数据_量化交易之如何获取股票历史数据并存为csv量化研究尤其是进行基于价值投资的量化研究,需要上市公司的历史估值数据,如市盈率PE,市净率PB,或者市销率PS,市现率PCF。而有的人喜欢用exce或者csv文件的格式存放数据并且分析。我这里介绍一个网站,BaoStock,既支持直接下载历史数据为csv,也支持用程序下载数据并生成csv格式。网站地址是www.baostock.com,如果要下载历史估值数据,进入首页后,选择“沪深A股估值指标(日…

    2022年6月24日
    37
  • Iocomp Ultra Pack ActiveX 5.12[通俗易懂]

    Iocomp Ultra Pack ActiveX 5.12[通俗易懂]Iocomp的ActiveX/VCLStdPack是一个包含29个控件的套件,老版本Iocomp激活成功教程版很多,用于创建使用ActiveX或VCL开发环境的专业仪器应用程序。这些控件可用于科学、工程、医疗、石油和天然气、半导体、工厂自动化、航空航天、军事、机器人、电信、楼宇和家庭自动化、HMI、SCADA以及数百种其他类型的应用。所有Iocomp控件均启用OPC。如果您的项目需要OPC连接,您可以将任何属性连接到您的OPC项目/标签。所有连接都可以使用Iocomp属性编

    2022年7月25日
    7

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号