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


相关推荐

  • LaTex中输入空格以及换行

    LaTex中输入空格以及换行1.使用\表示空格以及调整空格的大小quad空格 a\qquadb 两个m的宽度 quad空格 a\quadb 一个m的宽度 大空格 a\b 1/3m宽度 中等空格 a\;b 2/7m宽度 小空格 a\,b 1/6m宽度 没有空格 ab …

    2022年5月15日
    447
  • django验证码登录_双重认证怎么关闭

    django验证码登录_双重认证怎么关闭djoser是什么?作用:Django认证系统的REST实现。djoser库提供了一组DjangoRestFramework视图,用于处理注册、登录、注销、密码重置和帐户激活等基本操作。它适用于

    2022年7月30日
    8
  • 携牵引力之手,与编程到老!

    携牵引力之手,与编程到老!

    2022年3月13日
    51
  • mysql数据库存储过程讲解与实例分析_数据库存储过程的优点

    mysql数据库存储过程讲解与实例分析_数据库存储过程的优点存储过程简介SQL语句需要先编译然后执行,而存储过程(StoredProcedure)是一组为了完成特定功能的SQL语句集,经编译后存储在数据库中,用户通过指定存储过程的名字并给定参数(如果该存储过程带有参数)来调用执行它。存储过程是可编程的函数,在数据库中创建并保存,可以由SQL语句和控制结构组成。当想要在不同的应用程序或平台上执行相同的函数,或者封装特定功能时,存储过…

    2025年7月31日
    2
  • xampp linux_xampp安装出错

    xampp linux_xampp安装出错xampp是一套很好使用的web服务器组合软件,这里教大家如何在linux安装搭建xampp,希望能帮助到你首先下载xampp安装包Linux版xampp-linux-1.8.3.5-install.run用root用户登录到Linux系统,不是root用户的,用su命令切换下windows系统下百度搜索xampp,下载完成后可以用SSH工具将下载的文件上传到Linux系统中linux系统下,可以…

    2025年6月9日
    1
  • 负采样_欠采样

    负采样_欠采样参考1参考2

    2022年4月19日
    67

发表回复

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

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