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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM