Qt——多线程

news2024/9/22 10:26:58

一、QThread类

        如果要设计多线程程序,一般是从QThread继承定义一个线程类,并重新定义QThread的虚函数 run() ,在函数 run() 里处理线程的事件循环。

        应用程序的线程称为主线程,创建的其他线程称为工作线程。主线程的 start() 函数会在其内部调用 run() 函数,然后 exec() 函数会让 run() 函数保持运行,进入工作线程的事件循环,随时接收系统事件。如下图所示:

注:MyThread 继承于 QThread。

二、线程同步

1. 互斥量(Mutex)

        在多线程程序中,线程之间可能需要访问同一个变量(临界资源),或一个线程需要等待另一个线程完成某个操作才产生相应的动作。QMutexQMutexLocker 都是基于互斥量的线程同步类。

        QMutex lock() 函数用来锁定互斥量,unlock() 函数用来解锁互斥量。这两个方法必须配对使用。其次还要一个 tryLock() 函数,如果函数返回 true 则表示成拿到了共享资源。示例如下:

QMutex  mutex;

void MyThread::run() {
    while(true) {
        mutex.lock();       //锁定互斥量
        ...
        mutex.unlock();     //解锁互斥量
    } 
}

         QMutexLocker 和 QMutex 相比,是一个简化了互斥量处理的类。它的构造函数接受互斥量作为参数并将其锁定,其析构函数则将此互斥量解锁。QMutexLocker 会使其在生存期内的代码片段得到保护。示例如下:

QMutex  mutex;

void MyThread::run() {
    while(true) {
         if (mutex.tryLock(500))    //尝试锁定一个信号量,最多等500ms
         {
            QMutexLocker locker(&mutex);    //锁定mutex,超出if范围自动解锁
            ...  
         }
    } 
}

2. 读写锁(ReadWriteLock)

        使用互斥量时存在一个问题,那就是每次只有一个线程获得互斥量的使用权限。如果在一个程序中有多个线程读取某个变量,那么这个变量就不是临界资源,是允许同时访问的。这时我们就需要 Qt 提供的读写锁类 QReadWriteLock,它是基于读或写的方式进行代码片锁定的。

        其中 lockForRead() 函数会以只读方式锁定资源,锁定后其他线程只能读不能写。 lockForWrite() 函数以写的方式锁定资源,锁定后其他线程不能读也不能写。

3. 条件等待(WaitCondition)

        QWaitCondition 提供了一种改进的线程同步方法。它通过与 QReadWriteLock 结合使用,可以使一个线程在满足一定条件下通知其他多个线程,使其他多个线程即时进行响应。

        其中 wait() 函数用于释放互斥量,wakeAll() 函数用于唤醒所有处于等待状态的线程。wait() 函数定义如下:

bool wait(QReadWriteLock *readWriteLock, unsigned long time)

        QWaitCondition 一般用于生产者/消费者(producer/consumer)问题。暂且假设缓冲区一直有资源且无限大,示例代码如下:

QReadWriteLock rwLocker;    //读写锁

QWaitCondition waiter;    //控制线程同步的对象

// 生产者
void ProducerThread::run() {
    while(1) {
        rwLocker.lockForWrite();    //以写方式锁定
        ...
        rwLocker.unlock();          //解锁
        waiter.wakeAll();       //唤醒其他等待的线程
        msleep(500);    //线程休眠500ms
    }
}

// 消费者1
void ConsumerThread1::run() {
    while(1) {
        rwLocker.lockForRead();     //以只读方式锁定
        waiter.wait(&rwLocker);     //等待被唤醒
        ...
        rwLocker.unlock();          //解锁
    }
}

// 消费者2
void ConsumerThread2::run() {
    while(1) {
        rwLocker.lockForRead();     //以只读方式锁定
        waiter.wait(&rwLocker);     //等待被唤醒
        ...
        rwLocker.unlock();          //解锁
    }
}

4. 信号量(Semaphore)

         信号量与互斥量类似,但二者又有区别。一个互斥量只能被锁定一次,而信号量可以被多次利用。信号量通常用来保护一定数量的相同资源,如双缓冲区。

        QSemaphore 就是 Qt 实现信号量功能的类。其中 acquire(int n) 用于尝试获得n个资源,release(int n) 用于释放n个资源。available() 用于返回当前信号量的可用资源个数。

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

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

相关文章

猫头虎 分享已解决Bug || Failed to start docker.service: Unit not found. 解决方案

猫头虎 分享已解决Bug || Failed to start docker.service: Unit not found. 解决方案 今天猫头虎带您解决一个在运维工作中常见的问题: Failed to start docker.service: Unit not found.。这是一个困扰了许多运维小伙伴的问题,尤其是在部署Docker时&a…

安全测试担心效果不好?这3个安全测试工具你用了吗?

其实在信息科技发展的初期,很多互联网公司就有意识到保护软件产品安全的重要性。但时至今日,我们还是经常能看到某某app软件泄露用户隐私信息,或遭受黑客攻击导致一些损失,其中不乏有一定市场地位的大厂。此类信息安全问题屡见不鲜…

元素设置了sticky粘性布局后,关于滚动后怎么样让这个元素自动添加阴影,我用自定义指令实现

前言 在写h5或者pc站的时候,顶部总会固定一些东西。然后我们会设置顶部的容器为粘性布局固定在顶部。但滚动之后会很僵硬。例如下面这样: 我们看看element的表格的效果: 再来看看最后我们实现的效果: 其实网上也有纯css实现…

简单创建代理工厂

简单创建代理工厂 一般对于JDBC来说,无非就是连接数据库、查询数据库、封装实体、返回实体,如果要设计一个ORM框架的话也就是要考虑怎么把用户自定义的数据库操作接口、XML中的SQL语句、数据库三者给联系起来,其实最适合的操作就是代理&…

2766:最大子矩阵

网址如下&#xff1a; OpenJudge - 2766:最大子矩阵 用dp来做就行了 代码如下&#xff08;MLE&#xff09;&#xff1a; #include<cstdio>const int maxn 101; int dp[maxn][maxn][maxn][maxn]; int martix[maxn][maxn]; int N, ans;int main(void) {scanf("%d&q…

jackson 轻松搞定接口数据脱敏

一、简介 实际的业务开发过程中&#xff0c;我们经常需要对用户的隐私数据进行脱敏处理&#xff0c;所谓脱敏处理其实就是将数据进行混淆隐藏&#xff0c;例如下图&#xff0c;将用户的手机号、地址等数据信息&#xff0c;采用*进行隐藏&#xff0c;以免泄露个人隐私信息。 如…

C++_基本语法笔记_模板

函数模板 基本使用 思想是Java里的泛型&#xff08;不确定用什么类型的数据&#xff09; 这里template这一句&#xff0c;意思是声明T是泛型&#xff0c;后面写用到泛型T的函数。 建议都用template<class T> 应用场景&#xff1a;不同数据类型的交换函数 两种使用方法…

猫咪泪痕消除术!希喂主食罐开启补水大作战!

我家小猫之前的泪痕真的不是一般的严重&#xff0c;每天都能看到它眼角挂着两条明显的褐色痕迹&#xff0c;我每天早晚都得小心翼翼地帮它擦拭&#xff0c;但效果总是微乎其微&#xff0c;眼眶边总是留下那么一圈顽固的黑色痕迹&#xff0c;我真是既忧心又无奈。 后来&#xff…

2024【十大品牌网】发布|车载WiFi十大品牌排行榜

自驾游无法随时随地联网?货车司机流量不够用&#xff1f;网约车线上抢单网速不好&#xff1f;来看看最新发布的车载WiFi十大品牌排行榜&#xff0c;帮你解决网速慢、流量不够用的问题&#xff01; 1.格行 格行作为有15年历史的老牌物联网企业&#xff0c;在产品质量和服务上…

沃可趣助力乐园工会:员工活动的数字化创新与实践

企业组织员工活动难处多多 预算不足都算轻的&#xff0c;时间协调也颇有难度&#xff0c;活动内容设计更是既要激发员工兴趣&#xff0c;又要符合企业文化&#xff0c;这让原本专注于OA服务和福利平台开发的公司纷纷退缩。 因此&#xff0c;当群硕决定在沃可趣上增加活动管理…

渲染优化策略,如何在有限资源下实现最佳视觉效果

在数字内容创作领域&#xff0c;渲染是一个至关重要的环节&#xff0c;它决定了最终图像或动画的视觉质量。然而&#xff0c;高质量的渲染往往伴随着高计算资源需求&#xff0c;如何在有限资源下实现最佳的视觉效果&#xff0c;成为了创作者们不断探索的课题。 一、优化3D模型…

青颖飞帆(青书)大模型算法工程师面试题6道|含解析

问题1、Decoder-Only和Encoder-Decoder模型相比有什么优势&#xff1f;在训练和推理效率上有什么区别&#xff1f;**** Decoder-Only模型&#xff1a;结构较为简洁&#xff0c;通常只由一个解码器组成。模型参数较少&#xff0c;相比于Encoder-Decoder模型在训练和推理上可能更…

UE5学习笔记9-创建一个小窗口提示人物是否和武器重叠

一、目标 创建一个UsrWidget去显示如果人物和武器重叠显示窗口&#xff0c;如果人物和武器不重叠将窗口隐藏 二、创建窗口并显示 1.创建一个窗口蓝图类&#xff0c;命名为PickUpWidget&#xff0c;这个蓝图类不需要C类&#xff0c;在对应文件夹中单机右键选择用户界面的控件蓝…

torch分布式训练DataParallel和DistributedDataParallel

Pytorch 分布式训练主要有两种方式&#xff1a; torch.nn.DataParallel > 简称 DP torch.nn.parallel.DistributedDataParallel > 简称DDP 其中 DP 只用于单机多卡&#xff0c;DDP 可以用于单机多卡也可用于多机多卡&#xff0c;后者现在也是Pytorch训练的主流用法&…

维基知识库系统Wiki.js本地Linux环境部署并配置公网地址远程访问

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

所生成项目的处理器架构“MSIL”与引用“***”的处理器架构“x86”不匹配。

在c#工程里新建了一个类库&#xff0c;编译的场合出现以下警告&#xff1a;C:\Program Files\Microsoft Visual Studio\2022\Enterprise\MSBuild\Current\Bin\amd64\Microsoft.Common.CurrentVersion.targets(2401,5): warning MSB3270: 所生成项目的处理器架构“MSIL”与引用“…

单链表leetcode刷题/下(C语言版)

目录 题目1&#xff1a;返回倒数第k个结点 题目2&#xff1a;回文链表 题目3&#xff1a;相交链表 题目1&#xff1a;返回倒数第k个结点 如图&#xff0c;该题使用到了快慢指针的思想。先定义两个指针&#xff0c;同时指向链表的首元结点&#xff0c;然后让fast指针向前先走…

秋招突击——8/15——知识补充——Socket通信

文章目录 引言正文基于TCP协议的Socket通信基于UDP协议的Socket通信服务端如何接收更多项目多进程多线程IO多路复用select轮询IO多路复用epoll事件通知 使用Socket实现同一个机器上的多线程通信服务端创建对应socket监听端口客户端发起对应的连接请求 总结 引言 上次面试腾讯的…

Qt篇——:-1: error: collect2.exe: error: ld returned 1 exit status错误

错误如图所示&#xff1a; 出现这个错误的时候我们点击下面的 [4 编译输出]&#xff0c;可以看到具体的编译报错信息&#xff0c;找到对应的错误进行解决即可。 这里举个例子&#xff0c;比如最常见的一种错误原因是&#xff1a;multiple definition of ......。这代表着你重复…

视频号小店升级微信小店,视频号直播电商将迎来新变化!

8月12日&#xff0c;腾讯发布《视频号小店升级为微信小店的公告》-意见征集通知&#xff0c;及其相关规则通知。 ▲ 图片来源&#xff1a;腾讯公告 公告称&#xff1a;腾讯计划自08月25日起&#xff0c;正式支持商家将视频号小店升级成微信小店。 微信小店将进一步简化商家入驻…