QT假如有三个线程如何保证顺序执行

目录

1 QSemaphore

2 QMutex和QWaitCondition

3 QFuture


1 QSemaphore
#include <QSemaphore>
#include <QThread>
#include <QDebug>
QSemaphore sem1(1);
QSemaphore sem2(0);
QSemaphore sem3(0);class Thread1 : public QThread
{
public:void run() override{sem1.acquire();// 执行线程1的任务qDebug()<<"Thread1";sem2.release();}
};class Thread2 : public QThread
{
public:void run() override{sem2.acquire();// 执行线程2的任务qDebug()<<"Thread2";sem3.release();}
};class Thread3 : public QThread
{
public:void run() override{sem3.acquire();// 执行线程3的任务qDebug()<<"Thread3";sem1.release();}
};int main()
{Thread1 thread1;Thread2 thread2;Thread3 thread3;thread2.start();QThread::msleep(1000);thread1.start();thread3.start();thread1.wait();thread2.wait();thread3.wait();return 0;
}

在这个例子中,QSemaphore被用来控制线程的执行顺序。线程1首先开始执行,因为sem1的初始值为1。当线程1完成后,它会释放sem2,这允许线程2开始执行。同样,当线程2完成后,它会释放sem3,这允许线程3开始执行。当线程3完成后,它会释放sem1,这允许线程1再次执行。这个过程可以无限循环,直到你决定停止线程。
 

2 QMutex和QWaitCondition
#include <QMutex>
#include <QWaitCondition>
#include <QThread>
#include <QDebug>
QMutex mutex;
QWaitCondition condition;
int a = 1;class Thread1 : public QThread
{
public:void run() override{QMutexLocker locker(&mutex);while (a != 1)condition.wait(&mutex);// 执行线程1的任务qDebug()<<"Thread1 run";a = 2;condition.wakeAll();}
};class Thread2 : public QThread
{
public:void run() override{QMutexLocker locker(&mutex);while (a != 2)condition.wait(&mutex);// 执行线程2的任务qDebug()<<"Thread2 run";a = 3;condition.wakeAll();}
};class Thread3 : public QThread
{
public:void run() override{QMutexLocker locker(&mutex);while (a != 3)condition.wait(&mutex);// 执行线程3的任务qDebug()<<"Thread3 run";a = 1;condition.wakeAll();}
};int main()
{Thread1 thread1;Thread2 thread2;Thread3 thread3;thread2.start();QThread::msleep(100);thread1.start();thread3.start();thread1.wait();thread2.wait();thread3.wait();return 0;
}

在这个例子中,QMutex和QWaitCondition被用来控制线程的执行顺序。每个线程在开始执行任务之前都会获取互斥锁,并检查当前应该执行的线程编号。如果线程编号不匹配,线程会等待条件变量。当线程完成任务后,它会更新线程编号并唤醒所有等待的线程。

这种方法的优点是它可以处理更复杂的线程同步问题,例如,当线程的执行顺序不是固定的,或者当线程需要等待多个条件时。

3 QFuture
#include <QtConcurrent>
#include <QFuture>
void function1() {// 执行线程1的任务qDebug()<<"function1";
}void function2() {// 执行线程2的任务qDebug()<<"function2";
}void function3() {// 执行线程3的任务qDebug()<<"function3";
}int main() {QFuture<void> future1 = QtConcurrent::run(function1);future1.waitForFinished();QFuture<void> future2 = QtConcurrent::run(function2);future2.waitForFinished();QFuture<void> future3 = QtConcurrent::run(function3);future3.waitForFinished();return 0;
}

在这个例子中,QtConcurrent::run用于在一个新的线程中运行一个函数,它返回一个QFuture对象,你可以使用QFuture::waitForFinished来等待线程完成。这种方法的优点是它非常简单,但是它只适用于你需要按顺序执行的线程,并且每个线程只执行一次的情况。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/663349.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

服务器为什么老是被攻击?被攻击了怎么办?

1、关闭端口&#xff0c;只打开必要的端口 服务器端口是攻击的主要入口&#xff0c;是服务器的外部窗口。服务器上的开放端口被黑客使用&#xff0c;他们通过这些开放端口攻击服务器。相对有效的预防方法是关闭一些不必要的端口&#xff0c;然后修改关键端口。如果你少开一个开…

《Lua程序设计》-- 学习10

环境&#xff08;Environment&#xff09; 具有动态名称的全局变量 全局变量的声明 由于Lua语言将全局变量存放在一个普通的表中&#xff0c;所以可以通过元表来发现访问不存在全局变量的情况。 正如前面所提到的&#xff0c;我们不允许值为nil的全局变量&#xff0c;因为值为…

Beats:在单个服务器上配置多个 Beats 实例

本文档作为如何在同一服务器上配置和运行 Filebeat/Metricbeat/Auditbeat 的多个实例的指南。 当你需要为同一台计算机上的不同应用程序或环境分离数据收集和处理时&#xff0c;此设置特别有用。 在今天的展示中&#xff0c;我们将以 Filebeat 为例来进行展示。此方法也适用于…

element-ui上传图片组件封装

//上传图片组件 定义文件imageUpload <template><div class"component-upload-image"><el-upload multiple :action"uploadImgUrl" list-type"picture-card" :on-success"handleUploadSuccess":before-upload"han…

Mybatis | 逻辑 sql - 结果的映射默认有缓存

mybatis 里 select 方法默认会使用缓存&#xff0c;即&#xff0c;如果逻辑 sql 的入参不变&#xff0c;则会走缓存。 所以对于只有表名 tableName 变&#xff08;用于 sharding&#xff09;的情况下&#xff0c;需要修改 xml 文件&#xff1a;flushCache true&#xff0c;来…

分享一个Qt使用的模块间通信类

需求&#xff1a; 不同线程&#xff0c;或者同一线程的不同类之间通信&#xff0c;按照Qt的机制&#xff0c;定义一个信号&#xff0c;一个槽&#xff0c;然后绑定。以两个类A,B为例&#xff0c;A触发一个信号&#xff0c;B执行一个槽&#xff0c;在定义好信号和槽之后&#x…

【Java程序设计】【C00196】基于(JavaWeb+SSM)的旅游管理系统(论文+PPT)

基于&#xff08;JavaWebSSM&#xff09;的旅游管理系统&#xff08;论文PPT&#xff09; 项目简介项目获取开发环境项目技术运行截图 项目简介 这是一个基于ssm的旅游平台 本系统分为前台、管理员2个功能模块。 前台&#xff1a;当游客打开系统的网址后&#xff0c;首先看到的…

C# 引用同一个dll不同版本的程序集

因为项目需要所以必须在项目中引用不同版本的同一程序集 我要引用的文件是newtonsoft.json.dll 两个版本为12.0.0.0 和4.0.0.0 1.如果已经先引入了newtonsoft.json 12.0.0.0版本的程序集&#xff0c;如果直接引入另一个版本的程序集的话会提示不成功&#xff0c;所以先将另一个…

分布式ID介绍实现方案总结

分布式 ID 介绍 什么是 ID&#xff1f; 日常开发中&#xff0c;我们需要对系统中的各种数据使用 ID 唯一表示&#xff0c;比如用户 ID 对应且仅对应一个人&#xff0c;商品 ID 对应且仅对应一件商品&#xff0c;订单 ID 对应且仅对应一个订单。 我们现实生活中也有各种 ID&…

BetrFS: A Compleat File System for Commodity SSDs——论文阅读

EuroSys 2022 Paper 分布式元数据论文汇总 问题 在不同的工作负载下&#xff0c;没有单一的Linux文件系统在普通SSD上始终表现良好。我们将一个完备的文件系统定义为在各种微基准测试和应用程序中&#xff0c;没有一个工作负载的性能低于最佳文件系统性能的30%&#xff0c;并…

EasyX图形库学习(一)

目录 一、easyX图形库基本介绍 1、easyX的原理 2、easyX的安装 3、easyX的颜色&#xff08;RGB颜色模型&#xff09; 颜色模型相关函数: 4、easyX的坐标 二、相关函数介绍: 绘图设备相关函数&#xff1a; 图形颜色及样式设置相关函数: 图形绘制相关函数: 文字输出相关…

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(下)

11.7.2 值语义与生命期 值语义的一个巨大好处是生命期管理很简单&#xff0c;就跟int一样——你不需要操心int的生命期。值语义的对象要么是stack object&#xff0c;要么直接作为其他object的成员&#xff0c;因此我们不用担心它的生命期&#xff08;一个函数使用自己stack上…

npm使用国内淘宝镜像

一、命令配置 1、设置淘宝镜像源 npm config set registry https://registry.npmmirror.com2、查看镜像使用状态 npm config get registry如果返回https://registry.npmmirror.com/,说明配置的是淘宝镜像。 如果返回https://registry.npmjs.org/,说明配置的是官网镜像。 二…

分享个前端工具-取色调色工具

这里虽然贴了两个&#xff0c;但推荐 Pipette. PipetteWin22.10.22.zip: https://download.csdn.net/download/rainyspring4540/88799632 图标&#xff1a; 界面&#xff1a; ColorPix https://download.csdn.net/download/rainyspring4540/88799642 图标&#xff1a; 界面…

开源协议介绍

开源协议是控制开源软件分发的法律声明&#xff0c;它使得软件能够被任何人自由使用、复制、修改和分发。下面是一些常见的开源协议&#xff1a; MIT 许可证&#xff1a;非常灵活的许可证&#xff0c;允许你做几乎任何事情&#xff0c;只要在副本中包含原始的版权和许可声明。…

Google Play上架:因行为透明度被拒审或下架的政策自查(基于区块链的内容)

近期很多朋友的项目出现因行为透明度问题被谷歌拒审或者已经上架的包被下架甚至封号,今天解释一下为什么会被封号下架,根据是什么? 目录 政策发布时间与截止时间政策内容政策背景政策解析和问题讲解政策发布时间与截止时间 基于区块链的内容相关政策,于2023-07-12 公布,…

看完这篇文章,你一定能看懂Datasheet!

大家好&#xff0c;我是砖一。 针对以上学妹的疑问&#xff0c;我有几点建议&#xff0c;大家可以听一下~ 一&#xff0c;怎么样查找Datasheet&#xff08;数据手册&#xff09; 大多数人下意识就点开浏览器&#xff0c;把型号往里面一输&#xff0c;不建议这样。 对于刚入行…

Fluent的小bug处理:后处理截面显示存在漏洞

最近发现的Fluent的bug&#xff0c;关于后处理截面显示不完整的问题。 1 现象 在使用六面体核心类型单元&#xff08;包括四面体-六面体核心和多面体-六面体核心&#xff09;进行网格划分的时候&#xff0c;可能会在截面上不能完整捕捉单元形状及其分布状态&#xff0c;导致做…

【计算机安全】相关整理

【安全】计算机安全相关整理 1.计算机安全是什么2.计算机安全研究与解决什么问题3.计算机安全构建在计算机的弱点之上4.不得不聊的密码学4.1 关键概念和基本技术&#xff1a;4.2 应用场景 5. 面向面经学习 归纳整理&#xff0c;便于回顾。 1.计算机安全是什么 计算机安全是指保…

linux使用iptables禁用ip

iptables是什么&#xff1f; iptables 是一个强大的开源软件&#xff0c;它是 Linux 系统内核中 netfilter 包过滤框架的一部分&#xff0c;用来实现防火墙功能。iptables 提供了一种灵活的方式来控制和管理进出以及通过 Linux 计算机的网络流量。 前提 我在云服务器上用doc…