QWaitCondition 类
QWaitCondition
用于多线程的同步,一个线程调用QWaitCondition::wait()
阻塞等待,直到另一个线程调用QWaitCondition::wake()
唤醒才继续往下执行。
#include "qmythread.h"
#include <QWaitCondition>
#include <QTime>
#include <QMutex>
QMutex mutex;
QWaitCondition newdateAvaiable;
int seq=0;
int diceValue=0;
QThreadProducer::QThreadProducer()
{
}
void QThreadProducer::stopThread()
{
QMutexLocker locker(&mutex);//在locker的生存周期内下面的程序是受保护的;
m_stop=true;
}
void QThreadProducer::run()
{
m_stop=false;
seq=0;
qsrand(QTime::currentTime().msec());
while (!m_stop) {
mutex.lock();
diceValue=qrand();
diceValue=(diceValue%6)+1;
seq++;
mutex.unlock();
//唤醒所有线程
newdateAvaiable.wakeAll();
msleep(500);//线程休眠500毫秒
}
}
QThreadConsumer::QThreadConsumer()
{
}
void QThreadConsumer::stopThread()
{
QMutexLocker locker(&mutex);
m_stop=true;
}
void QThreadConsumer::run()
{
m_stop=false;
while (!m_stop)
{
mutex.lock();
/*QWaitCondition 用于多线程的同步,一个线程调用QWaitCondition::wait() 阻塞等待,
* 直到另一个线程调用QWaitCondition::wake() 唤醒才继续往下执行。*/
newdateAvaiable.wait(&mutex);//先解锁mutex,是其他线程能够使用mutex
emit newValue(seq,diceValue);
mutex.unlock();
}
}
其中:QThreadProducer::run()
函数负责产生数据(每隔500ms产生一个数据),新的数据产生后通过等待条件唤醒所有等待的线程,即:
通过newdataAvailiable.allWake()
唤醒所有等待线程;
QthreadConsumer::run()
函数中的while
循环,首先需要将互斥量锁定,再执行下面的语句:newdataAvailable.wait(&mutex);
newdataAvailable.wait(&mutex);
中以mutex作为输入参数,内部首先会解锁mutex,是其他线程可以使用mutex
.newdataAvailable
进入等待状态。当QThreadProducer
产生数据使用newdataAvailable.wakeAll()
唤醒所有线程,newdataAvailable.wait(&metuex)
会再次锁定mutex
,然后退出阻塞状态,以执行后面的语句;
所以,当两个线程同时运行时,即.started()
后,均开始执行.run(),
由于 QthreadConsumer
通过newdataAvailable.wait(&mutex);
处于等待状态,不占用mutex
所以QThreadProducer::run()
可以顺利执行,直到解除mutex``,通过``newdataAvailable.wakeAll()
唤醒处于休眠的QthreadConsumer
线程。此时QthreadConsumer
会再次锁定mutex
,然后退出阻塞状态,以执行后面的语句;