Qt 多线程QThread的四种形式

2024-03-28 23:52

本文主要是介绍Qt 多线程QThread的四种形式,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

重点:

1.互斥量:QMutex配套使用,lock(),unlock(),如果一个线程准备读取另一个线程数据时候采用tryLock()去锁定互斥量,保证数据完整性。

QMutexLocker简化版的QMutex,在范围区域内使用。

QMutex mutex
QMutexLocker locker(&mutex);

2.读写锁:QReadWriteLock配套使用,lockForWrite(),lockForRead(),它允许多个线程以只读方式同步访问资源,但只要有一个线程以写入方式访问资源,其他线程就必须等待,直到写操作完成。QReadLocker和QWriteLocker是简化版的QReadWriteLock,

QReadWriteLock mutex;
QReadLocker locker(&mutex);
QWriteLocker locker(&mutex);

3.基于条件等待的线程同步:QWaitCondition通过与QMutex或者QReadWriteLock结合使用。

通过wakeAll()和wait()方法处理。 一旦读完一个数据,就通过wakeAll()唤醒等待的线程。

这里需要注意线程中传值的时候,在主线程和子线程中,通过信号与槽发送QString,遇到
QObject::connect: Cannot queue arguments of type 'QString&'问题

原因

不允许跨线程传递非const应用。

解决方法

就是要么是const引用,要么是值传递

4.基于信号量的线程同步:QSemaphore是一种限制对共享资源进行访问的ITC技术。互斥量只能被锁定一次,而信号量可以用多次。互斥量相当于列车上的卫生间,一次只能一个人使用,信号量则是多人公共厕所。n个资源就是信号量要保护的资源,资源怎么分配,看内部处理。

需要特别注意的是,两个线程之间因为两个信号量存在耦合,在线程结束不要使用threadA->terminate();   //强制结束线程

 if (threadA->isRunning()){threadA->terminate();   //强制结束线程threadA->wait();        //等待线程结束}

而要使用,否则重新启动线程会出问题。

 if (threadDAQ->isRunning())threadDAQ->stopThread();   //结束线程

 

 

这篇关于Qt 多线程QThread的四种形式的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/857041

相关文章

Python多线程实现大文件快速下载的代码实现

《Python多线程实现大文件快速下载的代码实现》在互联网时代,文件下载是日常操作之一,尤其是大文件,然而,网络条件不稳定或带宽有限时,下载速度会变得很慢,本文将介绍如何使用Python实现多线程下载... 目录引言一、多线程下载原理二、python实现多线程下载代码说明:三、实战案例四、注意事项五、总结引

Python多线程应用中的卡死问题优化方案指南

《Python多线程应用中的卡死问题优化方案指南》在利用Python语言开发某查询软件时,遇到了点击搜索按钮后软件卡死的问题,本文将简单分析一下出现的原因以及对应的优化方案,希望对大家有所帮助... 目录问题描述优化方案1. 网络请求优化2. 多线程架构优化3. 全局异常处理4. 配置管理优化优化效果1.

Java实现本地缓存的四种方法实现与对比

《Java实现本地缓存的四种方法实现与对比》本地缓存的优点就是速度非常快,没有网络消耗,本地缓存比如caffine,guavacache这些都是比较常用的,下面我们来看看这四种缓存的具体实现吧... 目录1、HashMap2、Guava Cache3、Caffeine4、Encache本地缓存比如 caff

Qt中实现多线程导出数据功能的四种方式小结

《Qt中实现多线程导出数据功能的四种方式小结》在以往的项目开发中,在很多地方用到了多线程,本文将记录下在Qt开发中用到的多线程技术实现方法,以导出指定范围的数字到txt文件为例,展示多线程不同的实现方... 目录前言导出文件的示例工具类QThreadQObject的moveToThread方法实现多线程QC

Python获取浏览器Cookies的四种方式小结

《Python获取浏览器Cookies的四种方式小结》在进行Web应用程序测试和开发时,获取浏览器Cookies是一项重要任务,本文我们介绍四种用Python获取浏览器Cookies的方式,具有一定的... 目录什么是 Cookie?1.使用Selenium库获取浏览器Cookies2.使用浏览器开发者工具

RabbitMQ消费端单线程与多线程案例讲解

《RabbitMQ消费端单线程与多线程案例讲解》文章解析RabbitMQ消费端单线程与多线程处理机制,说明concurrency控制消费者数量,max-concurrency控制最大线程数,prefe... 目录 一、基础概念详细解释:举个例子:✅ 单消费者 + 单线程消费❌ 单消费者 + 多线程消费❌ 多

Javaee多线程之进程和线程之间的区别和联系(最新整理)

《Javaee多线程之进程和线程之间的区别和联系(最新整理)》进程是资源分配单位,线程是调度执行单位,共享资源更高效,创建线程五种方式:继承Thread、Runnable接口、匿名类、lambda,r... 目录进程和线程进程线程进程和线程的区别创建线程的五种写法继承Thread,重写run实现Runnab

Qt使用QSqlDatabase连接MySQL实现增删改查功能

《Qt使用QSqlDatabase连接MySQL实现增删改查功能》这篇文章主要为大家详细介绍了Qt如何使用QSqlDatabase连接MySQL实现增删改查功能,文中的示例代码讲解详细,感兴趣的小伙伴... 目录一、创建数据表二、连接mysql数据库三、封装成一个完整的轻量级 ORM 风格类3.1 表结构

SQL Server配置管理器无法打开的四种解决方法

《SQLServer配置管理器无法打开的四种解决方法》本文总结了SQLServer配置管理器无法打开的四种解决方法,文中通过图文示例介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录方法一:桌面图标进入方法二:运行窗口进入检查版本号对照表php方法三:查找文件路径方法四:检查 S

Qt QCustomPlot库简介(最新推荐)

《QtQCustomPlot库简介(最新推荐)》QCustomPlot是一款基于Qt的高性能C++绘图库,专为二维数据可视化设计,它具有轻量级、实时处理百万级数据和多图层支持等特点,适用于科学计算、... 目录核心特性概览核心组件解析1.绘图核心 (QCustomPlot类)2.数据容器 (QCPDataC