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

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

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

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

QMutexLocker locker(&mutex);

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

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

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

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

thread.h

#include <QThread>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker>
#include <QWaitCondition> extern int a;
extern QMutex m_mutex; class Thread : public QThread
{
public:
Thread();
~Thread(); void setQuit(); protected:
void run(); private:
bool m_quit;
}; thread.cpp #include <thread.h> int a = ;
QMutex m_mutex; Thread::Thread():
m_quit(false)
{ } Thread::~Thread()
{
QMutexLocker m_lock(&m_mutex);
m_quit = true;
quit();
wait();
} void Thread::run()
{
while (!m_quit)
{
QMutexLocker m_lock(&m_mutex);
a *= ;
qDebug()<<"thread1: "<<a<<endl;
a /= ;
qDebug()<<"thread2: "<<a<<endl; }
} data.h #include <QThread>
#include <QDebug>
#include <QMutex>
#include <QMutexLocker> extern QMutex m_mutex;
extern int a; class Data : public QThread
{
public:
Data();
~Data(); void setQuit(); protected:
void run(); private: bool m_quit;
}; data.cpp #include <data.h> Data::Data():
m_quit(false)
{ } Data::~Data()
{
QMutexLocker m_lock(&m_mutex);
m_quit = true; quit();
wait();
} void Data::run()
{
while (!m_quit)
{
QMutexLocker lock(&m_mutex); a *= ;
qDebug()<<"data1: "<<a<<endl;
a /= ;
qDebug()<<"data2: "<<a<<endl;
} }

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. Java集合对比

    1.array和ArrayList 的区别?1.1:ArrayList是Array的复杂版本1.2:数组不能扩容集合可以扩容1.3:存储的数据类型:Array只能存储相同数据类型的数据,而ArrayL ...

  2. 微信H5页面前端开发,大多数人都会遇到的几个兼容性坑

    最近给公司微信公众号,写了微信h5业务页面,总结分享一下前端开发过程中的几个兼容性坑,项目直接拿的公司页面,所以下文涉及图片都模糊处理了. 1.ios端兼容input光标高度 问题详情描述:input ...

  3. Oracle 11g Java驱动包ojdbc6.jar安装到maven库,并查看jar具体版本号

    ojdbc6.jar下载 Oracle官方宣布的Oracle数据库11g的驱动jar包是ojdbc6.jar ojdbc6.jar下载地址:https://www.oracle.com/technet ...

  4. JSVC安装

    执行./start-all.sh启动hadoop时报错 Starting datanodes node1: ERROR: Cannot set priority of datanode process ...

  5. Docker2 docker commit方法镜像制作

    一.前期准备 1.下载一个centos镜像,进入容器,安装wget docker pull centos docker run -it centos bash [root@web1 ~]# docke ...

  6. [jsp学习笔记] jsp基础知识 数据初始化、同步

  7. springboot中常用的依赖

    <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...

  8. [TensorFlow]Windows下安装并运行Hello World

    参考网址:https://www.tensorflow.org/install/pip (或要VPN) 建议电脑是独显N卡机,安装前先升级驱动,减少不必要错误 1.下载Microsoft Visual ...

  9. tp5隐藏入口文件(基于nginx)

    location / {             try_files $uri $uri/ /index.php?$query_string; #这项配置解决访问根目录以外路径报404的错误      ...

  10. CentOS 6.5本地yum源、局域网离线yum仓库(断网情况下轻松安装各种依赖包)

    在工作中, 公司的服务器大部分都禁止连接外网的,初始化系统,测试某些产品时,往往缺一些软件或依赖包,一个个上传到机器,如此浪费时间,浪费金钱,en...yum能够自动查找并解决rpm包之间的依赖关系, ...