关于Qt和C++中对于线程的控制权不同的处理方式

62 篇文章 14 订阅
50 篇文章 0 订阅

今天一个bug花了很大的精力才确定了它的位置,这个bug的起因在于主线程是用纯C++写的,但是集成的子线程却是使用Qt的QThread类写的,这就导致如果不进行特殊处理的话,C++写的主线程无法获得子线程的控制权。

这就导致主线程跑主线程的,子线程跑子线程的,造成应用程序退出的时候,子线程的退出清理逻辑没法执行完,然后进程就结束了,分配给子线程的资源也已经被回收了,这就很烦。

我在子线程的清理逻辑中加了一个关闭数据库的操作,现在的情况就是程序退出,数据库关闭指令没法执行!!!

然后一怒之下,我就去查了查C++和Qt的对于子线程的控制权有着怎么的设计。
后来发现,Qt的设计比较巧妙些,Qt中的每个类都可以为之添上基类,这样派生类的控制权就在基类手中,基类负责派生类的生死存亡,然后一层层往上叠,只要设计的合理,那么最终就会有一个总的基类来负责其下所有派生类,以及派生类的派生类的的生命周期。
这样做的好处就是我可以不管我写的这个类的死亡,我只要给我写的类添加上基类,那么就不会造成内存泄露。
C++中就没有普遍性的这样的设计,但是std::thread这个除外,这个类中引入了join函数,意味着主线程必须等待子线程结束之后才能退出,也勉强不错。

以上是针对于相同开发环境中的情况,但是我现在的情况是C++的主线程+Qt的子线程,这就不适用上面的情况。
怎么搞呢?

查了查,采用“回调函数”是一种方法,不过这种方法太麻烦了,但是我目前没有找到更为合适的方式。
我目前采用的方法就是在退出的时候强制将主线程睡眠一段时间,留给子线程足够的退出时间。
这个方法太野路子了,难登大雅之堂,如果读者有合适的方法,还请不吝赐教,万分感谢。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值