当前位置: 首页 > news >正文

Qt线程等待条件QWaitCondition

Qt 线程等待条件

概念

  Qt提供了QWaitCondition类实现“等待条件”式的线程控制方法,它让线程阻塞在等待条件的地方,直到条件满足后才继续执行下去。也就是说,QWaitCondition可以使一个线程在满足一定条件时通知其他多个线程,使它们及时作出响应。
  QWaitCondition类成员函数

函数名称函数描述
QWaitCondition()构造并初始化对象
wai()解锁互斥量,并阻塞等待唤醒条件
wakeAll()唤醒所有处于等待状态的线程,线程唤醒的顺序不确定,由操作系统的调度策略决定
wakeOne()唤醒一个处于等待状态的线程,唤醒哪个线程不确定,由操作系统的调度策略决定
notify_all()相当于wakeAll().此函数兼容STL
notify_one()相当于wakeOne().此函数兼容STL

程序示例

读取线程启动进入等待唤醒状态,当写入数据线程写入数据完成后唤醒所有读取线程,读取线程再继续执行;

// 公共数据和锁&等待唤醒对象
class TestData
{
public:
    static int sm_nSharedNumber;
    static QReadWriteLock sm_ReadWriteLock;
    static QWaitCondition sm_WaitCondition;
};

int TestData::sm_nSharedNumber = 10;
QReadWriteLock TestData::sm_ReadWriteLock;
QWaitCondition TestData::sm_WaitCondition;

// 写入数据线程
class WorkThread2 : public QThread
{
    Q_OBJECT
public:
    explicit WorkThread2(QObject *parent = nullptr);
    ~WorkThread2() = default;

protected:
    void run() override;
};

WorkThread2::WorkThread2(QObject *parent) : QThread(parent)
{

}

void WorkThread2::run()
{
    TestData::sm_ReadWriteLock.lockForWrite();
    TestData::sm_nSharedNumber += 5;
    TestData::sm_nSharedNumber *= 10;

    qDebug() << QString::fromLocal8Bit("write1 ----- 线程2 ID:") << QThread::currentThreadId() << "Result = " << TestData::sm_nSharedNumber;
    qDebug() << QString::fromLocal8Bit("write2 ----- 线程2 ID:") << QThread::currentThreadId() << "Result = " << TestData::sm_nSharedNumber;
    qDebug() << QString::fromLocal8Bit("write3 ----- 线程2 ID:") << QThread::currentThreadId() << "Result = " << TestData::sm_nSharedNumber;

    TestData::sm_WaitCondition.wakeAll();
    TestData::sm_ReadWriteLock.unlock();
}

// 读取数据线程
class WorkThread1 : public QThread
{
    Q_OBJECT
public:
    explicit WorkThread1(QObject *parent = nullptr);
    ~WorkThread1() = default;

protected:
    void run() override;

};

WorkThread1::WorkThread1(QObject *parent) : QThread(parent)
{

}

void WorkThread1::run()
{
    TestData::sm_ReadWriteLock.lockForRead();

    // 先解锁 QReadWriteLock ,其他线程可以使用 QReadWriteLock
    TestData::sm_WaitCondition.wait(&TestData::sm_ReadWriteLock);

    qDebug() << QString::fromLocal8Bit("read1 ----- 线程1 ID:") << QThread::currentThreadId() << "Result = " << TestData::sm_nSharedNumber;
    msleep(10);
    qDebug() << QString::fromLocal8Bit("read2 ----- 线程1 ID:") << QThread::currentThreadId() << "Result = " << TestData::sm_nSharedNumber;
    msleep(20);
    qDebug() << QString::fromLocal8Bit("read3 ----- 线程1 ID:") << QThread::currentThreadId() << "Result = " << TestData::sm_nSharedNumber;

    TestData::sm_ReadWriteLock.unlock();
}

// 测试函数
void Test()
{
    unique_ptr<WorkThread1> upThread11 = std::make_unique<WorkThread1>();
    unique_ptr<WorkThread1> upThread12 = std::make_unique<WorkThread1>();
    unique_ptr<WorkThread1> upThread13 = std::make_unique<WorkThread1>();

    unique_ptr<WorkThread2> upThread2 = std::make_unique<WorkThread2>();

	// 先启动读取函数,让函数处在等待阻塞状态
    upThread11->start();
    upThread12->start();
    upThread13->start();

    QThread::msleep(10);

    upThread2->start();

    upThread11->wait();
    upThread12->wait();
    upThread13->wait();
    upThread2->wait();

    qDebug() << "Over!";
}
http://www.dtcms.com/a/107467.html

相关文章:

  • 深入理解DRAM刷新机制:异步刷新为何无需扣除刷新时间?
  • 风电行业预测性维护解决方案:给风机装上 “智能医生”,实现故障 “秒级预警”
  • HTMX构建无重载闪烁的交互式页面
  • Vue开发系列——npm镜像问题
  • Frida Hook Native:jobjectArray 参数解析
  • SQL Server 增删改查详解
  • 使用pytesseract和Cookie登录古诗文网~(python爬虫)
  • 从Hugging Face下载Qwen/Qwen2-Audio-7B-Instruct模型到本地运行,使用python实现一个音频转文字的助手
  • 树莓派超全系列教程文档--(21)用户配置
  • 芋道源码——Spring Cloud Bus RocketMQ 入门
  • 《全栈+双客户端Turnkey方案》架构设计图
  • 软件版本号递增应该遵循的规范
  • 分层防御:对称与非对称加密如何守护数字世界
  • 0402-对象和类(访问器 更改器 日期类)
  • 北方算网获邀在中关村论坛发言 解析人工智能+产业落地核心路径
  • 【数据库原理及安全实验】实验一 数据库安装与创建
  • openEuler24.03 LTS下安装HBase集群
  • YOLO学习笔记 | 基于YOLOv5的车辆行人重识别算法研究(附matlab代码)
  • Ubuntu 22.04 安装和运行 EDK2 超详细教程
  • 门控循环单元(GRU)基础学习与实例:电影评论情感分类
  • 微信小程序开发-01.介绍
  • Java 基础-29-final关键字-详解
  • 当网页受到DDOS网络攻击有哪些应对方法?
  • 【mysql 的安装及使用】
  • SuperMap GIS基础产品FAQ集锦(20250402)
  • 02_使用Docker在服务器上部署Jekins实现项目的自动化部署
  • Docker Registry 清理镜像最佳实践
  • 06-21-自考数据结构(20331)- 查找技术-动态查找例题分析
  • 02-Docker 使用
  • libevent 核心数据结构