Qt中关于线程需要注意的地方

本文详细记录了在多线程环境中动态调整线程数量时遇到的问题,包括如何正确删除线程以避免unhandled exception错误,以及在共享数据时通过信号传递指针的重要性。同时,解释了析构函数并未包含停止线程执行的操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

以前一直没弄多线程的东西,这几天试了以下,结果弄出很多问题出来,记录下。

如何删除线程:

为了可以动态调节线程的数量,我把所有的线程都放在一个vector中,当需要的数量大于vector.count()的时候则创建并加入线程;当需要减少线程数的时候则通过如下代码实现:

QThread* thd = vector.last();

delete thd;

vector.pop_back();

普通用法估计没有什么问题,但在需要动态调节数量并且这些线程都共用一些东西的时候就有很大的问题了。

delete thd;并没有让线程结束,如果是在windows下可以说只是将其操作的HANDLE给删除掉了,并没有停止代码块在系统线程队列的运行,所以其实我们的线程还是运行当中的,并且这样处理了之后就真的无法停止线程了。

这样做的坏处有2个:

1.访问一些对象(例如线程共享)的时候提示unhandle exception;

2.调用emit signal之后sender()被提示unhandle exception;

所以正确的做法应该是先disconnect(),然后在terminate(),最后delete掉它。


在线程共享数据的时候如果没有特殊要求应该首选通过信号传递指针值,当然别忘了处理完之后delete掉。


没有细看源代码不知道QThread的析构函数在怎么写的,不过从这里可以看出析构函数中并没有停止线程执行的相关操作,小小的失望了下。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值