waitforsingleobject的一点点事情

本文记录了一次上位机程序退出时出现卡死现象的排查过程。作者通过debug定位到问题出现在一个名为BB的DLL中,该DLL在关闭设备和释放内存时阻塞在了一个无限等待线程的状态。最终,通过终止线程解决了问题。

前几天,在写上位机代码的过程中,遇到了这样一个问题,当程序退出时,出现了卡死的现象。

刚开始没有去理会,但是当程序打开关闭多次之后,就有点不耐烦了,于是,debug一步步找出卡死原因。

跟上位机接口对接的是用VT,我不了解VT,以前也没用过VT,只是知道一点点应用,其中就有一个叫BB的东西,他是跟下位机对接的主要模块,说白了也就是windows上的一个DLL。于是,调试就从这个DLL的stop函数入手。

在stop()里面,调用了release(),在release里面实现了设备的关闭和内存的释放,两者都是在一个类里面实现,于是就进入类的析构,在类的析构里面,发现了一句waitforsingleobject(handle,INFINITE),程序就卡死在这里。

由于我不大懂windows编程,也不大懂windows上怎么用线程的,之前都是在linux上编程,于是只能google,终于,答案出来了,waitforsingleobject(handle,infinte)是在不断的等待handle的信号,我这里的handle是一个线程,如果线程不退出,就不会有返回,因为waitforsingleobject是阻塞的,所有程序卡死在那里,不断等待,看起来就是卡死得现象。

到这里,我才突然焕然大悟,原来是我关闭的时候,线程没有退出。之前,在我的记忆里,我只知道,进程关闭,它的线程都会被关闭,但是没有想到居然在主线程上阻塞自己...

解决办法很简单,让那个线程return就行了...

BB是一个很让我惊讶的地方,只要有点内存没释放,就会崩溃,在解决上面的问题后,我还得仔细研究下BB到底崩溃在哪里,所以,又 跟内存耗吧、、、

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值