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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • FileInputStream概述[通俗易懂]

    FileInputStream概述[通俗易懂]一FileInputStream概述FileInputStream:从文件系统中的文件获取输入字节。可用的文件取决于主机环境。FileInputStream用于读取诸如图像数据的原始字节流。要读取字符流,请考虑使用FileReader。二FileInputStream的构造方法1.FileInputStream(Filefile)通过打开与实际文件的连接来创建FileInputStream,该文件由文件系统中的File对象file命名。2.FileInputSt…

    2022年6月4日
    48
  • 树莓派 Raspberry Pi 连接 WiFi

    树莓派 Raspberry Pi 连接 WiFi说明开启Wifi的不同情况说明:第一种情况:有显示器和鼠标键盘1.1:桌面操作开启WiFi,包含桌面图形的系统(RaspbianStretchwithdesktop)1.2:通过树莓派配置,适用带桌面或仅命令行的系统。1.3:直接修改配置文件,适用带桌面或仅命令行的系统。第二种情况:无显示器和鼠标键盘2.1:使用另一台可用电脑编辑SD卡(但我尝试不成功,ORZ,望…

    2022年5月18日
    44
  • 如何破解“仅三天可见”的朋友圈?

    如何破解“仅三天可见”的朋友圈?来源:扩展迷EXTFANS(ID:infinitydaily)之前微博上出现过一个热搜话题:超一亿人朋友圈仅三天可见。微信创始人张小龙在年度演讲里说,这个开关,是微信里使用最多的。很多网…

    2022年6月12日
    38
  • 工商银行近20年实时大数据平台建设历程「建议收藏」

    工商银行近20年实时大数据平台建设历程「建议收藏」全文共4000个字,建议阅读10分钟一、工行实时大数据平台建设历程工商银行从2002年开始建设数据集市,当时主要使用Oracle类单机版的关系型数据库。随着数据量不断增加,开始引入TD、ED等国外高端一体机。2014年工行正式基于Hadoop技术建设了大数据平台,在其之上构建了企业级数据湖及数据仓库。2017年,随着AI技术的兴起,又开始建设机器学…

    2022年6月7日
    44
  • VideoAdsSpeed_延时视频如何去闪

    VideoAdsSpeed_延时视频如何去闪项目官网:http://vllab.ucmerced.edu/wlai24/video_consistency/当对视频进行操作时,若不考虑帧与帧之间的关系,只对单张图像进行例如风格迁移、上色、超分辨率处理等等,会造成视频结果的不连贯,出现闪烁,这个论文提出了一种方法,可以无视图像处理的方法,直接解决视频不连续问题。论文亮点:1.用卷积LSTM有效的去除了视频中的闪烁,并且在测试的时候不需要…

    2022年10月10日
    3
  • Linux vim怎么保存退出 vim怎么用

    Linux vim怎么保存退出 vim怎么用linux系统是主要用于服务器使用,一般配置文件修改都是通过vi或vim来实现。相比vi而言vim有更强大的功能,本经验咗嚛以centos7.6为例演示linux下vim如何退出 安装vim一般来说vim都是系统默认没有安装的,使用yuminstall-yvim安装。 安装好之后,输入vi按下tab键看到有vim命令表示安装成功了。 如何使用vim默认输入vim就进入了vim,可以查看vim的基本指令 vim+文件名表示编辑此文件,如.

    2022年5月9日
    72

发表回复

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

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