首先需要注意的是:QMutexLocker这个类是基于QMutex的便利类,这个类不能够定义 私有成员变量 和 全局变量,只能够定义局部变量来使用。
使用方法
(1)先定义一个QMutex类的变量
QMutex m_mutex; //可以是私有成员变量,也可以是全局变量
(2)在定义一个QMutexLocker类的变量(注意:在需要上锁的地方直接定义即可)
QMutexLocker locker(&mutex);
a=5;//等等需要进行写的操作
使用注意:
(1)如果需要对一个全局变量区域进行保护,那么QMutex定义的变量就得是全局的!
解锁原理
QMutexLocker上锁,解锁的原理:在该局部变量被创建的时候上锁,当所在函数运行完毕后该QMutexLocker局部变量在栈中销毁掉,根据他自己的机制也就相对应的解锁了。注意,如果该局部变量在中间被打断,那么QMutexLocker上的锁就不会被解锁掉,因为该函数没有被完整的是执行完。QMutexLocker所创建的局部变量也没有被正确销毁销毁,
可能就和QMutexLocker他自己本身的机制不服也就不会解锁。
例子
操作重点在析构函数中加入让线程停止部分
#include
#include
#include
#include
#include extern int a;
extern QMutex m_mutex;class Thread : public QThread
{
public:Thread();~Thread();void setQuit();protected:void run();private:bool m_quit;
};
#include 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: "<
#include
#include
#include
#include 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::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: "<
}
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
上一篇:2024“中国收视最好的10部剧”排名,《追风者》第5,《繁花》第4 2024“中国收视最好的10部剧”排名,《追风者》第5,《繁花》第4
下一篇:斯卢茨基:海港和泰山水平很高 金顺凯被国奥征调要离队2个月 斯卢茨基:海港和泰山水平很高 金顺凯被国奥征调要离队2个月