首先需要注意的是:QMutexLocker这个类是基于QMutex的便利类,这个类不能够定义   私有成员变量  和  全局变量,只能够定义局部变量来使用

使用方法:(1)先定义一个QMutex类的变量

QMutex   m_mutex;   (可以是私有成员变量,也可以是全局变量)

(2)   在定义一个QMutexLocker类的变量(注意:在需要上锁的地方直接定义即可)

QMutexLocker locker(&mutex);

a = 5; //等等需要进行写的操作

使用注意:  (1)如果需要对一个全局变量区域进行保护,那么QMutex定义的变量就得是全局的!

(2)QMutexLocker上锁,解锁的原理:在该局部变量被创建的时候上锁,当所在函数运行完毕后该QMutexLocker局部变量在栈中销毁掉,根据他自己的机制也就相对应的解锁了。注意,如果该局部变量在中间被打断,那么QMutexLocker上的锁就不会被解锁掉,因为该函数没有被完整的是执行完。QMutexLocker所创建的局部变量也没有被正确销毁销毁,可能就和QMutexLocker他自己本身的机制不服也就不会解锁。

下面的例子是在两个线程(thread和data)中分别对一个全局变量进行写操作(操作重点在析构函数中加入让线程停止部分):

  1. thread.h
  2.  
  3. #include <QThread>
  4. #include <QDebug>
  5. #include <QMutex>
  6. #include <QMutexLocker>
  7. #include <QWaitCondition>
  8.  
  9. extern int a;
  10. extern QMutex m_mutex;
  11.  
  12. class Thread : public QThread
  13. {
  14. public:
  15. Thread();
  16. ~Thread();
  17.  
  18. void setQuit();
  19.  
  20. protected:
  21. void run();
  22.  
  23. private:
  24. bool m_quit;
  25. };
  26.  
  27. thread.cpp
  28.  
  29. #include <thread.h>
  30.  
  31. int a = ;
  32. QMutex m_mutex;
  33.  
  34. Thread::Thread():
  35. m_quit(false)
  36. {
  37.  
  38. }
  39.  
  40. Thread::~Thread()
  41. {
  42. QMutexLocker m_lock(&m_mutex);
  43. m_quit = true;
  44. quit();
  45. wait();
  46. }
  47.  
  48. void Thread::run()
  49. {
  50. while (!m_quit)
  51. {
  52. QMutexLocker m_lock(&m_mutex);
  53. a *= ;
  54. qDebug()<<"thread1: "<<a<<endl;
  55. a /= ;
  56. qDebug()<<"thread2: "<<a<<endl;
  57.  
  58. }
  59. }
  60.  
  61. data.h
  62.  
  63. #include <QThread>
  64. #include <QDebug>
  65. #include <QMutex>
  66. #include <QMutexLocker>
  67.  
  68. extern QMutex m_mutex;
  69. extern int a;
  70.  
  71. class Data : public QThread
  72. {
  73. public:
  74. Data();
  75. ~Data();
  76.  
  77. void setQuit();
  78.  
  79. protected:
  80. void run();
  81.  
  82. private:
  83.  
  84. bool m_quit;
  85. };
  86.  
  87. data.cpp
  88.  
  89. #include <data.h>
  90.  
  91. Data::Data():
  92. m_quit(false)
  93. {
  94.  
  95. }
  96.  
  97. Data::~Data()
  98. {
  99. QMutexLocker m_lock(&m_mutex);
  100. m_quit = true;
  101.  
  102. quit();
  103. wait();
  104. }
  105.  
  106. void Data::run()
  107. {
  108. while (!m_quit)
  109. {
  110. QMutexLocker lock(&m_mutex);
  111.  
  112. a *= ;
  113. qDebug()<<"data1: "<<a<<endl;
  114. a /= ;
  115. qDebug()<<"data2: "<<a<<endl;
  116. }
  117.  
  118. }

https://blog.csdn.net/zhaoyuaiweide/article/details/77991658

QMutexLocker基于QMutex的便利类的更多相关文章

  1. 第15.28节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTableWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 表格部件为应用程序提供标准的表格显示工具,在表格内可以管理基于行和列的数据项,表格中的最大 ...

  2. 再谈AbstractQueuedSynchronizer:基于AbstractQueuedSynchronizer的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...

  3. 再谈AbstractQueuedSynchronizer3:基于AbstractQueuedSynchronizer的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...

  4. Java 并发编程-再谈 AbstractQueuedSynchronizer 3 :基于 AbstractQueuedSynchronizer 的并发类实现

    公平模式ReentrantLock实现原理 前面的文章研究了AbstractQueuedSynchronizer的独占锁和共享锁,有了前两篇文章的基础,就可以乘胜追击,看一下基于AbstractQue ...

  5. C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法

    本文实例讲述了C#基于SQLiteHelper类似SqlHelper类实现存取Sqlite数据库的方法.分享给大家供大家参考.具体如下: 这个类不是我实现的,英文原文地址为http://www.egg ...

  6. PHP基于单例模式编写PDO类的方法

    一.单例模式简介 简单的说,一个对象(在学习设计模式之前,需要比较了解面向对象思想)只负责一个特定的任务: 二.为什么要使用PHP单例模式? 1.php的应用主要在于数据库应用, 所以一个应用中会存在 ...

  7. Python3操作MySQL基于PyMySQL封装的类

    Python3操作MySQL基于PyMySQL封装的类   在未使用操作数据库的框架开发项目的时候,我们需要自己处理数据库连接问题,今天在做一个Python的演示项目,写一个操作MySQL数据库的类, ...

  8. 第15.27节 PyQt(Python+Qt)入门学习:Model/View架构中的便利类QTreeWidget详解

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 树部件(Tree Widget)是Qt Designer中 Item Widgets(It ...

  9. 第二十二章、 Model/View便利类树型部件QTreeWidget

    老猿Python博文目录 专栏:使用PyQt开发图形界面Python应用 老猿Python博客地址 一.引言 树部件(Tree Widget)是Qt Designer中 Item Widgets(It ...

随机推荐

  1. quartz2.3.0(十三)数据库持久化定时器job任务和trigger触发器,在多个调度器实例情况下,由其它调度器实例恢复执行调度器宕机的job任务

    一.初始化数据库11张quartz表:qrtz_*   先从官网下载好quartz2.3.0包:http://www.quartz-scheduler.org/downloads/ 解压后进入目录:q ...

  2. COGS 有标号的DAG/强连通图计数

    COGS索引 一堆神仙容斥+多项式-- 有标号的DAG计数 I 考虑\(O(n^2)\)做法:设\(f_i\)表示总共有\(i\)个点的DAG数量,转移考虑枚举DAG上所有出度为\(0\)的点,剩下的 ...

  3. Spring Cloud Alibaba学习笔记(17) - Spring Cloud Gateway 自定义路由谓词工厂

    在前文中,我们介绍了Spring Cloud Gateway内置了一系列的路由谓词工厂,但是如果这些内置的路由谓词工厂不能满足业务需求的话,我们可以自定义路由谓词工厂来实现特定的需求. 例如有某个服务 ...

  4. 在 WPF 中获取一个依赖对象的所有依赖项属性

    原文:在 WPF 中获取一个依赖对象的所有依赖项属性 本文介绍如何在 WPF 中获取一个依赖对象的所有依赖项属性. 本文内容 通过 WPF 标记获取 通过设计器专用方法获取 通过 WPF 标记获取 p ...

  5. docker的学习总结

    一 docker的8个使用场景1.简化配置虚拟机的最大好处是能在你的硬件设施上运行各种配置不一样的平台(软件, 系统), Docker在降低额外开销的情况下提供了同样的功能. 它能让你将运行环境和配置 ...

  6. 11.15java实习生面试总结

    坐了两个小时的车,到了面试地点面了十五分钟左右就结束了,心里有一点难受,不过这也是刚开始,后面的路还长着呢,所以先把面试官问的题目记录下来. 1.C语言能否跨平台? 虽然我面的是java实习生,但是因 ...

  7. 使用 Code First 数据库迁移

    当 Entity Framework Code First 的数据模型发生改变时,默认会引发一个System.InvalidOperationException 的异常.解决方法是使用DropCrea ...

  8. 刚接触HTML5应该先学哪里才好?

    好吧,话不多说,直接来点干货吧! 刚接触html的小白都感觉摸不着头脑?应该怎么学习呢,其实HTML5可能对于还没有接触过的小白来说会比较的难,听起来也比较新颖.这是个什么骚东西!其实不然,这个就是构 ...

  9. apk反编译工具包for Mac OS的使用

    在本文中我将介绍如何在Mac OS X上使用apktool.jar.dex2jar.jd-gui来进行apk的反编译和查看源码.下面会提供每个工具的下载地址. 测试环境:OS X EI Capitan ...

  10. Mongodb之增删改查操作

    一.创建一个数据库 在我们使用MongoDB数据库时引进了这样一个知识,“对于mongodb,使用了不存在的对象,就等于在创建这个对象”,所以创建数据库的操作就比较简单 在我们使用mysql数据库时u ...