QWaitCondition的使用

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,然后退出阻塞状态,以执行后面的语句;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值