在对象的线程结束后从父线程删除QObject是否安全?
在对象的线程结束后从父线程删除QObject是否安全?
嗨,你的这种做法完全安全,只要你像代码里那样,确保线程已经彻底终止(调用了quit()并且wait()成功返回)就行。
咱们来拆解下你的代码流程,就能明白为什么安全:
- 你创建了
testThr线程和testObj对象,把对象移到线程中 - 启动线程后,你调用
testThr.quit()终止了线程的事件循环,接着调用testThr.wait()——这个wait()会一直阻塞当前线程,直到testThr对应的线程所有执行逻辑完全结束,线程彻底退出 - 等
wait()返回的时候,testThr的线程已经停掉了所有活动,它的事件循环早就不转了,也不会有任何属于这个线程的代码再去碰testObj
这时候你在父线程里delete testObj,根本不会有数据竞争的问题——因为没有其他线程在操作这个对象了啊!线程都彻底停了,哪来的并发访问?自然不会和之前的事件循环有任何冲突。
至于你提到的deleteLater(),它的作用是让对象在自己所属线程的事件循环里安排删除操作,但如果线程已经结束(事件循环都退出了),deleteLater()的请求根本不会被处理。而且你本来就需要在线程结束后继续用testObj,所以不用deleteLater()完全合理。
最后再啰嗦几个要注意的小细节:
- 一定要确认
wait()成功完成:如果wait()超时或者返回false,说明线程没正常终止,这时候可不能随便删对象 - 要保证没有其他外部代码(比如其他还在跑的线程)还拿着
testObj的指针在访问它 - 你的
testObj没设置父对象,这点做得很对——如果有父对象,父对象的生命周期管理可能会和你的手动删除冲突,保持无父状态才好自己掌控它的销毁时机
内容来源于stack exchange
相关产品推荐
相关产品推荐

