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)
上一篇 2021年9月11日 下午5:00
下一篇 2021年9月11日 下午6:00


相关推荐

  • 对L1正则化和L2正则化的理解[通俗易懂]

    一、奥卡姆剃刀(Occam’srazor)原理:     在所有可能选择的模型中,我们应选择能够很好的解释数据,并且十分简单的模型。从贝叶斯的角度来看,正则项对应于模型的先验概率。可以假设复杂模型有较小的先验概率,简单模型有较大的先验概率。  二、正则化项     2.1、什么是正则化?   正则化是结构风险最小化策略的实现,在经验风险上加一个正则项或罚项,正则项一共有两种L1…

    2022年4月11日
    190
  • Snort安装_snorer

    Snort安装_snorer1、下载源文件wgethttps://www.snort.org/downloads/snort/daq-2.0.6.tar.gzwgethttps://www.snort.org/downloads/snort/snort-2.9.8.0.tar.gz2、解压安装tarxvfzdaq-2.0.6.tar.gzcddaq-2.0.6./configure;mak

    2025年8月3日
    5
  • Kotlin学习之路(2)数据类型

    Kotlin学习之路(2)数据类型

    2021年3月12日
    154
  • Python 使用sqlalchemy操作MYSQL

    Python 使用sqlalchemy操作MYSQL

    2022年4月3日
    42
  • redash+mysql_Redash – 安装和初试

    redash+mysql_Redash – 安装和初试前言当业务成长到一定规模之后 会有许多想看各种不同类型报表的需求 如果单独做在后台 那么无疑会浪费前端和后端开发的时间 所以一直都有在寻找一款好用的 BI 工具 后面查了一下 市面上好用的一些非商业的 BI 工具 主要的是 Superset Redash Metabase 这三种 评测请看 数据可视化的开源方案 SupersetvsRe 一 数据可视化的开源方案

    2026年3月18日
    1
  • 【Minecraft Modding】创建第一个Item

    【Minecraft Modding】创建第一个Item【MinecraftModding】创建第一个Item1.编辑mods.toml文件2.建立目录和包3.编辑Test.java3.注册物品4.定义物品的属性5.runClient在环境创建完成的基础上,就可以开始创建模组了!本文将叙述如何创建一个Item,即Minecraft中的掉落物。1.编辑mods.toml文件首先需要在IntelliJIDEA中载入项目,找到src\main\resources\META-INF\mods.toml文件。该文件包含了这个Mo

    2022年7月8日
    27

发表回复

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

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