QT中QWaitCondition 线程同步【注意事项】

void WorkerThread::doLongTimeWork()
{
    QMutexLocker locker(&mutex);

    if (!isRunning()) {
        start(QThread::LowPriority);
    }
    else {
        condition.wakeOne();
    }
}

函数doLongTimeWork(),里面构造了一个局部的QMutexLocker对象并锁住互斥量,当QMutexLocker被销毁的时候,互斥量将被自动解锁(因为QMutexLocker是个局部变量,当函数返回时它就被销毁),当执行函数doLongTimeWork()时,如果线程未运行,则调用start()开启线程,如果线程已经在运行了,则调用condition.wakeOne()唤醒线程。

void WorkerThread::run()
{
    static int count = 0;
    forever {
        if (abort)
            return;
        mutex.lock();
        //当处于wait状态时mutex会被暂时释放(会自动调用unlock解锁之前锁住的资源,避免造成死锁),并阻塞在这个地方;当线程被cond.wakeOne()等唤醒时,mutex又会被重新锁定,并继续运行
        this->loadDataFromFile();
        emit sendCount(count++);
        condition.wait(&mutex);//QWaitCondition 用于多线程的同步,一个线程调用QWaitCondition::wait() 阻塞等待,直到另一个线程调用QWaitCondition::wake() 唤醒才继续往下执行
        mutex.unlock();
    }
}

run()中的condition.wait(&mutex)会让mutex会被暂时释放(会自动调用unlock解锁之前锁住的资源,避免造成死锁),并阻塞在这个地方,当线程被cond.wakeOne()等唤醒时,mutex又会被重新锁定,并继续运行

注意QMutex与QWaitCondition区别:

QMutex::lock相当于临界区锁,让处于锁中的资源不能被别的线程访问,即自己霸着不让别人用。
QWaitCondition::wait相当于互斥量锁,让线程等着,当别的线程访问完了,自己才能访问,即自己排队等着别人用完自己再用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值