QT线程同步技术详解

Qt同步线程的几种方法 一、QMutex类 QMutex类就像一把锁,在互斥量之前上锁(QMutex::lock()),然后在使用完互斥量之后解锁(QMutex::unlock())。比如下面的代码: void someMethod() { mutex.lock(); qDebug()<<"Hello"; qDebug()<<"World"; mutex.unlock(); } 阅读详情

一、线程同步概念

二、QT线程同步技术简介

2.1初级锁

2.2读写锁

2.3条件锁

三、QT线程同步应用详解

3.1初级锁

3.2读写锁

3.3条件锁


一、线程同步概念

        线程同步,广义上的概念一般指多线程间对资源“读”与“写”权限的管理策略,为了避免数据冲突与数据不一致,关于此概念,网上介绍很多,在此不赘述。

二、QT线程同步技术简介

2.1初级锁

        对需要保护的资源上锁,独占式使用,如:公厕的蹲坑,一次只能一人用,你进入了,你就会反锁,别人就进不去,这就是初级的独占式上锁。

        QT提供了相关的类QMutex,有lock和unlock函数,成对使用。

2.2读写锁

        为了更高效的利用资源,QT提供了读写权限分离锁QReadWriteLock,有以下4种应用场景:

        A:我在读的时候,你也可以读:一起看看无所谓,又不会看坏;

        B:我在读的时候,你不可以写:我读的时候,你不能动手,以免我看得眼花缭乱;

        C:我在写的时候,你不可以读:我动手时,你别看,以免你看不真切;

        D:我在写的时候,你不可以写:我动手时,你可别动手,搞不清楚到底谁动的手;

        以上,写的时候必须独占,读的时候可以共享读权限,但是也不能写,此机制提高了读的效率,简而言之,大家一起看看是可以的,但是谁都不能动手(修改)

2.3条件锁

        我也不知道应该怎么命名,所谓“条件锁”是我自己起的名,即用于线程之间同步,A线程下一步动作,依赖于B线程的任务完成后,及时通知A线程的一种机制。

        QT提供了此机制QWaitCondition,此机制结合QMutex与QWaitCondition两个类,让多个线程实现时序运行。

三、QT线程同步应用详解

3.1初级锁

        QMutex是QT封闭的一个互斥量,上锁操作提供两个函数lock与tryLock,前者阻塞方式死等,直到获取到锁的,后者可以设定等待时间,时间到了将返回;解锁操作函数为unlock函数。

        其实,lock与unlock是成对使用的,使用不当将造成严重后果。像new与delete一样,如果new了忘记了delete将造成内存泄漏,如果lock了,忘记了unlock将造成“死锁”,这问题是严重的,而且很难定位,那我们应该怎么规避呢?

        QT提供了一个类QMutexLocker解决此问题,它的策略很简单,用此类实例化一个对象的时候,需要把一个QMutex对象的指针传给它,在构造函数中,它就调用lock给加锁了,然后此对象析构时,在析构函数中会调用unlock,自动释放,如此,将永远都不可能出现死锁的情况了。

QMutex mutex;
void func()
{
	//实例化locker时,构造函数会对mutex加锁
	QMutexLocker locker(&mutex);
	
	//do something
	
	//因为locker是个局部变量,此函数退出时,
	//会析构,自然就会对mutex解锁
}

        这些设计是不是很巧妙?又非常简单。

        好的编程习惯,应该禁止使用直接调用lock、unlock,应该采用以上方法。

3.2读写锁

          读写锁的应用场景,2.2已经介绍,下面看代码实例:

QReadWriteLock lock;
void ReaderThread::run()
{
    lock.lockForRead();
    read_file();
    lock.unlock();
}

void WriterThread::run()
{
    lock.lockForWrite();
    write_file();
    lock.unlock();
}

        如3.1中介绍一样,里面获取锁与释放锁调用调用lock与unlock,将有死锁的风险,这不是严谨的编码风险,同时QT对读写锁与提供了如QMutexLocker一样功能的类,对应读、写锁分别是

QReadLocker、QWriteLocker,所以,以上代码应该改成如下:

QReadWriteLock lock;
void ReaderThread::run()
{
    QReadLocker locker(&lock);
    read_file();
}

void WriterThread::run()
{
    QWriteLocker locker(&lock);
    write_file();
}

        切记,不要写出高风险代码,不想随意相信手册与书本教的东西,实践中的得出的方法,才

是王道、

3.3条件锁

        我们设计这么一种场景,SendThead线程负责往TCP服务端发送数据,RecvThread线程负责从TCP服务端接收数据。

        SendThread发送数据后,需要得到TCP服务端的回应后,再执行下一步操作,所以,此场景下SendThread与RecvThread之间有一个时序关系,即SendThread线程的下一步动作,需要依赖RecvThread线程的结果,代码如下:

青铜写法:

QReadWriteLock lock;
void SendThread()
{
    lock.lock();
	
    SendMsg();
	
	QWaitCondition waitCdn;
	waitCdn.wait(&lock);
	
	
	//do something
	lock.unlock();
}

void RecvThread()
{
    RecvMsg();	
	
    lock.lock();
	QWaitCondition waitCdn;
	waitCdn.wakeAll(&lock);
	lock.unlock();
}

王者写法:

QReadWriteLock lock;
void SendThread()
{
    QMutexLocker locker(&lock);
	
    SendMsg();
	
	QWaitCondition waitCdn;
	waitCdn.wait(&lock);
	
	
	//have recv the Ack, do something	
}

void RecvThread()
{
    RecvMsg();	
	
    QMutexLocker locker(&lock);
	QWaitCondition waitCdn;
	waitCdn.wakeAll(&lock);
}

        QWaitCondition的wait函数,是会对传入的mutex互斥量,进行解锁,然后wait函数自身会阻塞,进到QWaitCondition的wakeAll或者wakeOne被调用,wait函数又马上对互斥量进行加锁。

        下面我们对以上代码进行解析,首先SendThread线程加锁,然后调用发送数据后,启用wait函数,等待RecvThread接收数据,此时wait对互斥量进行解锁,然后自己阻塞。

        下面,我们再看RecvThread,它先进行接收数据,然后,再加锁(此时,此锁被SendThread的wait函数给解了),然后再调用wakeAll函数。触发wait函数加锁,然后返回,SendThread此时又将继续往下执行。

        RecvThread为什么要加锁?因为,此处不加锁,可能导致wakeAll比wait函数先调用的极端情况,导致wait永远无法返回,从而,造成死锁。所以,当使用QWaitCondition编程时,如果没有此机制,此代码是风险代码,是不过关的,可以说,水平是非常次的。

        

QT使用线程以及线程同步 <br />   首先转载一个博客,学习如何使用QT线程<br />http://hi.baidu.com/%D2%C0%C8%BB%BD%DA%D7%E0%C0%B6%B5%F7/blog/item/da39f4f29aa93d00b17ec522.html<br />QThread 似乎是很难的一个东西,特别是信号和槽,有非常多的人(尽管使用者本人往往不知道)在用不恰当(甚至错误)的方式在使用 QThread,随便用google一搜,就能搜出大量结果出来。无怪乎Qt的开发人员 Bradley T 阅读详情

相关推荐

Qt同步线程

Qt同步线程 我们知道,多线程有的时候是很有用的,但是在访问一些公共的资源或者数据时,需要进行同步,否则会使数据遭到破坏或者获取的值不正确。Qt提供了一些类来实现线程的同步,如QMutex,QMutexLocker,QReadWriteLock,QReadLocker,QWriteLocker,QSemaphore和QWaitCondition。下面我们分别来看它们的用法: QMutex 首

hai200501019的专栏 5308

Qt线程同步的几种方法

Qt线程同步的几种方法一、QMutex类二、QMutexLocker便利类三、QReadWriteLock类四、QReadLocker便利类和QWriteLocker便利类对QReadWriteLock进行加解锁五、信号量QSemaphore六、条件触发QWaitCondition http://www.javashuo.com/article/p-gnyofzbl-gm.html https://blog.youkuaiyun.com/hulifangjiayou/article/details/47018895 一

宁静致远的博客 7069

Qt中的多线程同步

本文将介绍几种常用的线程同步技术,并提供相应的源代码示例。读写锁是一种特殊的锁,用于在读多写少的情况下提高并发性能。需要注意的是,在使用这些线程同步机制时,我们需要谨慎地处理锁的获取和释放,以免出现死锁或其他线程同步问题。此外,合理地设计线程间的通信和同步策略,可以提高程序的性能和可维护性。互斥锁是一种最基本的线程同步机制,它用于保护共享资源,使得同一时间只有一个线程可以访问该资源。通过使用互斥锁、读写锁和条件变量,我们可以实现在Qt中的线程同步和数据共享。发出条件满足的信号,唤醒等待的线程。

DevAstro的博客 359

QT 线程同步

线程同步指线程之间如何按照约定的先后次序执行。

m0_53891310的博客 1446

Qt中的线程同步

在Qt框架中,线程同步是一种重要的技术,用于确保多线程程序的正确性和稳定性。通过合适的线程同步机制,可以避免竞态条件(race condition)、死锁(deadlock)等多线程编程中常见的问题。本文将介绍几种常用的线程同步技术,并提供相应的源代码示例。本文介绍了Qt中的几种常用线程同步技术,包括互斥锁、信号量、条件变量和读写锁。通过使用上述线程同步技术,可以有效地控制多线程程序的并发访问,保证数据的一致性和正确性。读写锁是一种特殊的锁,允许多个线程同时读取共享资源,但只允许一个线程进行写操作。

CodeVorter的博客 212

Qt中实现线程同步非常重要。线程同步用于控制多个线程之间的访问和修改共享资源。在这篇文章中,我将介绍如何使用Qt实现线程同步。

在这个例子中,我们使用了QMutex来锁定globalVariable变量,从而实现线程同步。MyWorker类用于在后台线程中执行工作,并定期将globalVariable变量的值递增并发出valueChanged信号。在主函数中,我们创建了一个MyController对象,并调用start方法来开启工作线程。Qt中实现线程同步非常重要。在这篇文章中,我将介绍如何使用Qt实现线程同步。Qt中提供了QMutex类通过对共享变量上锁,实现线程同步。总之,Qt为我们提供了方便易用的线程同步机制。

. 625

QT线程同步

多线程编程的一个主要挑战是避免数据竞争和条件竞争。数据竞争发生在多个线程同时读写共享数据,而没有适当的同步机制时。条件竞争是指多个线程以特定的时序执行特定的操作,导致不期望的结果。同步策略在保护线程安全的同时,也可能会引入额外的性能开销。例如,锁的不当使用可能导致线程争用,从而降低效率。锁的粒度:选择合适的锁粒度,以减少争用和上下文切换的开销。锁的类型:根据应用场景选择互斥锁、读写锁(QReadWriteLock)、递归锁(QRecursiveMutex)等。

菜一头包的博客 1373

QT线程同步与异步处理

QT多线程专栏共有14篇文章,从初识线程到、QMutex锁、QSemaphore信号量、Emit、Sgnals、Slot主线程子线程互相传值同步变量、QWaitCondition、事件循环、QObjects、线程安全、线程同步、线程异步、QThreadPool线程池等线程操作进行了全面!深入!的研究和详细的说明

断点 6371

Qt多线程

Qt多线程

m0_51390725的博客 1705

Qt 之线程同步

使用线程的目的是允许代码并行运行,但是有时线程必须停止并等待其他线程。例如,如果两个线程试图同时写入相同的变量,结果是未知的。 迫使线程等待另一个的原则被称为互斥 。 这是一种保护共享资源等数据的常见的技术。

青春不老,奋斗不止! 1万+

深入解析rknn-toolkit2混合量化:如何为RK3588和RK356X选择最佳量化策略

本文深入解析了RKNN-Toolkit2混合量化技术,针对瑞芯微RK3588和RK356X芯片的硬件特性差异,提供了最佳量化策略选择指南。通过混合量化技术,开发者可以在保持较高推理效率的同时显著降低精度损失,特别适用于边缘计算场景。文章详细介绍了混合量化的技术原理、实战流程及芯片专属优化策略,帮助开发者充分利用硬件特性提升模型性能。

dog123的博客 258

QT多线程编程详解

一、线程基础 1、GUI线程与工作线程 每个程序启动后拥有的第一个线程称为主线程,即GUI线程。QT中所有的组件类和几个相关的类只能工作在GUI线程,不能工作在次线程,次线程即工作线程,主要负责处理GUI线程卸下的工作。 2、数据的同步访问 每个线程都有自己的栈,因此每个线程都要自己的调用历史和本地变量。线程共享相同的地址空间。 二、QT多线程简介 QT通过三种形式提供了对线程...

coolboywjun的专栏 8万+

告别理论!手把手教你用Patran/Nastran搞定悬臂翼的颤振分析(附完整模型文件)

本文提供了一份详细的Patran/Nastran悬臂翼颤振分析实战指南,涵盖从几何建模到结果解读的全过程。通过手把手教学和完整模型文件,帮助工程师和学生快速掌握气动弹性分析技术,特别适合需要实际操作的初学者。文章重点介绍了模态分析、气动建模和颤振求解等关键步骤,并提供了常见问题排查和优化建议。

weixin_30879169的博客 492

【Qt线程】—— Qt线程详解

Qt线程详解

m0_56069910的博客 7555

期末求生指南:手把手教你用F12开发者工具绕过百一测评的切屏检测(JavaScript/jQuery实战)

本文详细介绍了如何利用F12开发者工具绕过百一测评的切屏检测,通过分析JavaScript/jQuery中的blur()和focus()事件监听机制,提供实战技巧动态修改代码。文章涵盖事件监听定位、代码修改方法及应对高级检测机制的策略,适合需要临时解决线上考试限制的学生参考。

weixin_30731305的博客 447

S4-FPGA-K7板级原理图硬件实战

xilinx K7板级硬件实战

weixin_66510961的博客 6148

【QT专栏】QT中实现多线程的四种方式和线程同步

详细的介绍了在Qt中多线程使用和线程同步的概念,也可以参考Qt的开发文档并且介绍的及其细微入至!!!

weixin_43729127的博客 1万+

ComfyUI 的 LoRA 训练:素材打标签与调优全攻略

标签是 LoRA 训练的"地基"——地基打不牢,后续调参再精细也难出好效果。记住:标签要"少而精",聚焦独特点,用触发词控效果。下一篇我们将讲解参数设置,让你的优质标签发挥最大价值~

2301_78150483的博客 3098

Qt多线程线程同步详解

本文详细介绍了Qt框架中的多线程同步机制,主要包括互斥锁(QMutex)、读写锁(QReadWriteLock)、条件变量(QWaitCondition)和信号量(QSemaphore)。QMutex用于保护共享资源,提供基本加锁/解锁功能;QReadWriteLock在读多写少场景中更高效;QWaitCondition可协调线程执行顺序;QSemaphore则控制多资源访问。每种机制都配有代码示例和适用场景说明,帮助开发者在多线程编程中实现安全高效的同步控制。

本博客分享软硬件一体化开发实战。硬件涵盖 PCB 设计、STM32 等 MCU 底层开发;软件包含 C++、Rust,Qt/QML、PyQt、Slint、TouchGFX、LVGL 各类 GUI 框架。方便软硬件开发者查阅学习。欢迎关注! 1838

Python在振动信号处理中的应用(一):振动信号消除多项式趋势项

文章目录一、概述二、最小二乘法去除趋势项原理三、python模块介绍3.1 scikitlearn简介(1)转化器(Transformer)(2)估计器(Estimator)3.2 线性回归LinearRegression3.3 多项式PolynomialFeatures3.4 工作流Pipeline四、python代码实现4.1 构造模拟信号4.2 编写去除趋势项主代码4.3 展示算法效果五、TIPS 一、概述   在振动测试过程中,传感器或采集设备由于自身性能问题或受环境干扰(如温度、供电等影响),容易

白银时代的博客 8578

SAP CRP能力计划详细说明操作及相关配置

2、求助朋友同事的希望破灭后,网上找了资料发现在百度搜索的资料基本都是没有说明白什么才产能计划,都没有详细的操作说明,然后用google去搜索了一些相关的文章,好像也没有详细的文章。然后也去SAP的官网搜索了相关的文章,都是文字性的表述,对系统的配置都没有很大的帮助,很久之前有记得在隐身人的博客中有提到CRP的能力计划的文章,然后试着去找了一下相关的文章。5、首先产能排产肯定涉及的就是是能力的问题,能力第一个能想到的就是工作中心中的能力页签,在流程制造中也叫资源,其实都是一个东西。

我小时候很黑的博客 4516

Qt 线程同步的方式及数量详解

Qt 线程同步的方式及数量详解

xie__jin__cheng的博客 965

OpenClaw 多代理协同工作模式配置指南

OpenClaw 采用。

形上得其象,形下合于数;阴阳自济,玄理自明。 1万+

Qt线程同步类

Qt线程同步类 Qt线程同步类 QMutex QMutexLocker QReadWriteLock QReadLocker QWriteLocker QSemaphore QSemaphoreReleaser QWaitCondition Qt中常用到多线程,因此处理线程间的关系非常重要,对于Qt中的各种线程同步的方法,我在这里做了一个小结。 Qt为线程同步提供了至少8个类,...

DARKMOON的专栏 978

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【QT】线程控制和同步

qt线程QThread常用API介绍,如何创建一个线程,启动一个线程,以及什么是线程安全;qt中互斥锁QMutex的概念,及其使用,QMutexLocker 是 QMutex 的辅助类,⽤途:简化对互斥锁的上锁和解锁操作,避免忘记解锁导致的死锁等问题。;qt中条件变量和信号量的介绍

lzb_kkk的博客 1697

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

上一篇: RabbitMq的安装部署维护手册(windows)
下一篇: 中国二维码--汉信码(中国主导的首个二维码码制国际标准「汉信码」ISO/IEC 20830:2021《信息技术 自动识别与数据采集技术 汉信码条码符号规范》)
MingoJiang
博客等级 码龄14年 161粉丝 41原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

MingoJiang

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值