最近遇到一个比较诡异的故障.现象是这样的:进行长时间运行程序退不出来(经过测试大概大于6分钟) ,短时间一切正常(小于6分钟)。最后经过打日志等手段,在退出时执行到CoUninitialize时挂起(短时间运行是正常的)。本来以为是COM对象应用的不正确,释放时出问题,这个程序比较小,普查了一遍也没有发现什么问题。最后在网上找到一个谈到COM库6分钟的一个故障,我也就把这个归结为COM库的故障了。
这个故障大概是样的,远程COM之间交互式每2分钟PING一次,超过3次没有回复就认为对方断掉,就回收资源。而对方因为忙在这6分钟内没有回复,但对方还认为客户端在,在回收资源(CoUninitialize)就会挂起,具体细节的仔细研究COM机制才能弄清楚。
因为这个程序是有一个主线程创建单线程套件,还有一个工作线程也创建单线程套件,主线程通过消息通知工作线程工作内容,工作线程将工作进度和结果通过消息通知主线程。两个线程都有消息循环,工作线程的消息循环是在COM单线程套件中。
最后解决办法是将工作线程的消息循环放到套件外面,就可以解决了。本来是想要交换一下主线程和工作线程的COM服务器和客户端的角色。可能是因为消息循环原因。等以后有时间再将原理搞清楚,先解决了再说。
在项目开发过程中会有很多意想不到的风险的,有些是系统的故障,或则应用不合理导致的。
CoUninitialize挂起
最新推荐文章于 2021-12-15 09:21:05 发布