QMutexLocker基于QMutex的便利类

 

首先需要注意的是: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 = 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

#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 *= 3;
qDebug()<<"data1: "<<a<<endl;
a /= 2;
qDebug()<<"data2: "<<a<<endl;
}

}

 

 

 

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

 

posted @ 2019-06-24 17:38  狂奔~  阅读(5589)  评论(0编辑  收藏  举报