vc中调用TerminateThread终止线程所导致的死锁问题

来源:互联网 发布:易语言源码大全 编辑:程序博客网 时间:2024/05/10 01:18

程序中调用TerminateThread强制终止子线程,结果导致程序死锁。

子线程和主线程都使用了一个临界区变量。主线程创建子线程时,会调用临界区,从而对临界区加锁。子线程运行过程中也会对临界区加锁。这原本是不会导致任何问题的。

为了便于管理临界区,我定义了一个自动锁的类。CAutoLock自动锁,调用构造函数时,加锁,调用析构函数时,解锁。子线程中,就定义了自动锁的对象。——这个自动锁的对象,使用的是栈。

当子线程退出时,应该是解锁了!  即使子线程异常终止,只要栈内存被回收,那么也可以解锁的!因为,回收栈的时候,会调用自动锁对象的析构函数!

这么处理,一直都没有问题。但是,这次却出现了死锁!(和以往不同的是,这次开启了1900多个子线程http://blog.csdn.net/shanzhizi。)

调试结果显示,临界区处于锁定状态,没有解锁!而锁的拥有者是一个已经终止的线程

由此得出结论:TerminateThread终止线程后,堆栈没有被回收!

当我推出这样的结论时,很快就想到了MSDN上面的说明。以前看到MSDN关于TerminateThread函数的说明,其中提到,TerminateThread结束线程时,不会回收线程的栈!

对于MSDN中的这句话,我一直当它不存在。因为以往的分析结果,TerminateThread结束线程后,栈资源似乎被回收了,栈变量的析构函数被调用了!如果是这样的话,TerminateThread基本上是安全的!至少,对于线程函数局部变量的声明和回收,是安全的!而new的内存,自然还是需要手动回收的了。

但是,这次得出的结论,证明MSDN所说属实!

看来,应该尽量不使用TerminateThread终止线程http://blog.csdn.net/shanzhizi。

MSDN 2005 原文:TerminateThread is used to cause a thread to exit. When this occurs, the target thread has no chance to execute any user-mode code and its initial stack is not deallocated. DLLs attached to the thread are not notified that the thread is terminating.http://blog.csdn.net/shanzhizi

来自:http://zhanyonhu.blog.163.com/blog/static/1618604420103171235276/?fromdm&fromSearch&isFromSearchEngine=yes
原创粉丝点击