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

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

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 处理Simulink的代数环的方法为逐个添加一阶惯性环节

    处理Simulink的代数环的方法为逐个添加一阶惯性环节处理Simulink的代数环的方法为逐个添加一阶惯性环节。代数环实际上是微分方程的输入在第一步没有值,而如果串联一个积分器的话就可以有初值,从而避免。通过增加一个一个时步的惯性环节,实现在基本不改变输出的情况下避免代数环。测试是可行的。…

  • 解决:The Huawei Lite Simulator supports only Lite projects.

    解决:The Huawei Lite Simulator supports only Lite projects.

  • ArrayList扩容详解

    ArrayList扩容详解本文探讨一下ArrayList的扩容过程ArrayList底层是数组elementData,用于存放插入的数据。初始大小是0,当有数据插入时,默认大小DEFAULT_CAPACITY=10。如果在创建ArrayList时指定了initialCapacity,则初始大小是ArrayList1.验证扩容的代码示例从示例中可以看到,当添加元素时,如果元素个数+1>当前数组长度【size+1>elementData.length】时,进行扩容,扩容后的数组大小是:oldC.

  • vim 配置 clang-format[通俗易懂]

    vim 配置 clang-format[通俗易懂]vim配置clang-format

  • Python 数据相关性分析

    Python 数据相关性分析概述在我们的工作中,会有一个这样的场景,有若干数据罗列在我们的面前,这组数据相互之间可能会存在一些联系,可能是此增彼涨,或者是负相关,也可能是没有关联,那么我们就需要一种能把这种关联性定量的工具来对数据进行分析,从而给我们的决策提供支持,本文即介绍如何使用Python进行数据相关性分析。关键词python方差协方差相关系数离散度pandasnumpy实验数据准备…

  • R 语言的安装(详细教程)「建议收藏」

    R 语言的安装(详细教程)「建议收藏」文章目录前言一、R语言是什么?二、R下载1.官网2.downloadbase3.downloadRtools三、Rstudio下载1.官网2.downloadRstudio四、R安装五、Rtools安装六、Rstudio安装七.java的环境配置八.运行RStudio十.R包安装策略1.配置镜像1.修改配置文件1.修改全局设置2.简单命令3.升级R包4.安装Bioconductor上的R包总结前言我不生产知识,我只是知识的搬运工,以下内容是

发表回复

您的电子邮箱地址不会被公开。

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