首先需要注意的是:QMutexLocker这个类是基于QMutex的便利类,这个类不能够定义 私有成员变量 和 全局变量,只能够定义局部变量来使用。
使用方法
(1)先定义一个QMutex类的变量
QMutex m_mutex; (可以是私有成员变量,也可以是全局变量)
(2)在定义一个QMutexLocker类的变量(注意:在需要上锁的地方直接定义即可)
QMutexLocker locker(&mutex);
a=5;//等等需要进行写的操作
使用注意: (1)如果需要对一个全局变量区域进行保护,那么QMutex定义的变量就得是全局的!
解锁原理
QMutexLocker上锁,解锁的原理:在该局部变量被创建的时候上锁,当所在函数运行完毕后该QMutexLocker局部变量在栈
中销毁掉,根据他自己的机制也就相对应的解锁了。注意,如果该局部变量在中间被打断,那么QMutexLocker上的锁就不
会被解锁掉,因为该函数没有被完整的是执行完。QMutexLocker所创建的局部变量也没有被正确销毁销毁,
可能就和QMutexLocker他自己本身的机制不服也就不会解锁。
例子
操作重点在析构函数中加入让线程停止部分
thread.h和thread.cpp
#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; };
#include <thread.h> int a = 6; 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 *= 5; qDebug()<<"thread1: "<<a<<endl; a /= 4; qDebug()<<"thread2: "<<a<<endl; } }
data.h和data.cpp
#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; };
#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 *= 3; qDebug()<<"data1: "<<a<<endl; a /= 2; qDebug()<<"data2: "<<a<<endl; } }
main
Data* data=new Data(); Thread* thread=new Thread(); data->start(); thread->start();
结果:
data1: 18
data2: 9
thread1: 45
thread2: 11
data1: 33
data2: 16
thread1: 80
thread2: 20
https://blog.csdn.net/zhaoyuaiweide/article/details/77991658