性能特性测试系列3——QT线程与std::thread(上)之std::thread

14 篇文章 3 订阅

 测试完容器和function之后,立马开始测和总结qt线程和std::thread相关特性,之后可能会继续网络库的测试,如qt的tcp,udp和c++的tcp,udp的一些比较,至于为啥是比较qt和c++之间,我也不知道= =。

以前虽然也用线程,但没完整试,这次算是各种试一下吧,效率上的测试一是不太好测,二是也时间上不太够,所以效率上的对比没有测试。本篇不提供代码,只是做了各方面诸如互斥量,条件变量的一些简单总结= =。

测试环境:Qt5.7,vs2015。

一、std::thread:

 如下图所示:
这里写图片描述
(解释一般都是我自己的理解,所以如有错误,可以探讨)

 1、构造:只有move赋值和move构造函数了。这个就不需要多解释,一目了然,如果不懂move,请参考我另一篇: 传送门

 2、join:当前线程执行完这个区域后,阻塞,等待该子线程执行完之后,一起结束。

 3、detach:分离线程对象,允许独立执行,即this不再拥有它的权限,一旦该线程退出,该线程所占用的已分配资源将被释放。

一句话过渡:最大的问题就是要解决数据共享和并发操作问题——所以有以下几种机制:

二、互斥量与自解锁:

 这里将自解锁和互斥量放在一起,两者关联性很强,最主要的是,我作图的时候连着了,不好分开= =。
如下图所示:
这里写图片描述

 因为我列的图表很明确了,所以就不多解释,接着往下走。

一句话过渡:只有锁,但如果需要达成某个条件,如等待某个值多少时再处理,一直循环判断太占用cpu。

三、条件变量与future:

 这里参考了别人的文章: 传送门
如下图所示:
这里写图片描述

 这里算是先暂时从图中理解,有时间的话我再补充个更详细的。

四、原子操作机制:

 如下图所示

这里写图片描述
参考资料:传送门

 本次其实还有许多的东西可以说,只是做了个简单的图表,慢慢来,现在没有时间补充,总结完这些,其实理解上的话也比较简单,暂时就先这样,当做挖个坑吧= =。

ps:如果本文中图看不清,保存到电脑放大就行。

Qt中,`std::async` 和 `std::thread` 是用于执行异步任务的C++库中的线程工具。如果它们不运行,可能有以下几个原因: 1. **异常处理**:如果在创建或执行线程时发生错误,例如内存不足或线程函数抛出未被捕获的异常,那么线程可能不会启动。 2. **同步问题**:如果主线程没有加入到Qt事件循环中,或者异步操作没有正确地与Qt信号和槽关联,那么线程可能无法被正确调度和显示结果。 3. **线程安全**:如果线程访问了没有正确同步的共享资源,可能会因为数据竞争而被阻塞或导致错误。 4. **线程生命周期**:确保`std::async` 创建的任务在适当的时候被销毁,特别是当使用了RAII技术(Resource Acquisition Is Initialization)时,如果不正确地管理了线程对象,线程可能无法结束。 5. **代码逻辑问题**:线程函数可能因为逻辑错误,比如无限循环,导致无法正常退出。 为了解决这些问题,你可以尝试以下步骤: - **检查错误**:使用try-catch捕获并处理任何可能的异常。 - **加入Qt事件循环**:确保异步线程在主线程中调用`QThread::exec()` 或者关联到Qt信号/槽。 - **线程同步**:对共享资源使用互斥锁(mutex)或其他同步机制。 - **线程管理**:确保所有线程在完成任务后正确销毁。 - **审查代码**:仔细检查线程函数的逻辑,确保它按预期结束。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值