QT 线程同步 阻塞方式 死锁

前言

针对QT线程同步问题学习:主要QWaitCondition QMutex常用两种进行查阅资料学习。

一、QWaitCondition:

执行过程:主线程获取锁,condition 阻塞进入等待,接着释放锁;另一线程马上获取锁,唤醒condition,释放 锁;

waitCondition适用于需要根据条件判断线程的休眠与否的同步方式。一次可以有选择的让多个线程”同时执行”、”同时休眠”或”随机挑一个线程执行或休眠”,相较mutex方式来说灵活很多

 可以使用下面代码来很清楚的看到上锁解锁 的过程:

#include "widget.h"
#include <QApplication>


#include <QApplication>
#include <QWaitCondition>
#include <QThread>
#include<QTime>
#include<QDebug>
#include <QMutex>

const int DataSize = 1; //任务数
QList<int> taskList;//任务列表
QWaitCondition conditon;
QMutex mutex;
//发布任务的线程
class taskThread : public QThread
{
protected:
    void run()
    {
        QTime ttTime = QTime::currentTime();
        for (int i = 0; i < DataSize; ++i)
        {
            qDebug() <<"-----------------------------";
            mutex.lock();
            qDebug() <<"线程1上锁";
            taskList << i; //
            qDebug() <<"发布任务";
            conditon.wait(&mutex); //等待任务执行结束
            /*注意这一过程中隐藏了  mutex.lock();
                                conditon.wait();
                                mutex.unlock();    */
            qDebug() <<"任务结束";

            mutex.unlock();
            qDebug() <<"线程1解锁";
        }
        qDebug() <<"用时:"<< ttTime.msecsTo(QTime::currentTime()) ;
    }
};
//执行任务的现场
class execThread : public QThread
{
protected:
    void run()
    {
        while (1)
        {
            if(taskList.count() > 0)
            {
                int i = taskList.first();
                qDebug() <<"任务执行中:" ;
                taskList.removeAt(0);

                mutex.lock(); // 注意:唤醒前需要上锁,否则可能被发布任务线程的taskThread,再次上锁,导致死锁
                qDebug() <<"线程2上锁";
                conditon.wakeAll();
                mutex.unlock();
                qDebug() <<"线程2解锁";
            }
            else
            {
                msleep(1);
            }
        }
    }
};

int main(int argc, char *argv[])
{
    taskThread taskT;
    execThread execT;
    taskT.start();
    execT.start();
    taskT.wait();
    execT.wait();
    QApplication a(argc, argv);
    return a.exec();
}

结果显示:

 

二、QMutex

mutex适用于简单的线程同步,即各线程按照一定的条件顺序执行,且一次仅有一个线程活跃,其余线程休眠。QMutexLocker是QMutex的优化版

void ThreadOne_Run::run()
{
    mutex.lock();
    for(int index=0;index<8;index++)
    {
        qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<"ThreadOne_Run子线程ID "<<QThread::currentThread()<<"Add="<<Add;
        Add++;
    }
    mutex.unlock();
}

/*************************子线程2**************************************/
ThreadTwo_movetoThr::ThreadTwo_movetoThr(QObject *parent) : QObject(parent)
{
}

void ThreadTwo_movetoThr::slot_dealTask()
{
    QMutexLocker locker(&mutex);
    for(int index=0;index<8;index++)
    {
        qDebug()<<"["<<__FILE__<<"]"<<__LINE__<<__FUNCTION__<<"ThreadTwo_movetoThr子线程ID "<<QThread::currentThread()<<"Add="<<Add;
        Add++;
    }
}

三、死锁

待更新

四、鸣谢

参考博客:

QWaitCondition 的正确使用方法_flyoxs的博客-CSDN博客_qwaitcondition

Qt线程间同步,QWaitCondition和QMutex两种方式_架相的博客-CSDN博客_qt线程同步的方法

 Qt 线程同步(QMutex、QWaitCondition、QSemaphore)_福州-司马懿的博客-CSDN博客

 QT线程QMutex和 QWaitCondition 结合使用的例子_hss2799的博客-CSDN博客

  • 0
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老赵的博客

叮咚,你的赏钱已到账,嘿嘿嘿

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值