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 co
- vc中调用TerminateThread终止线程所导致的死锁问题
- 调用TerminateThread终止线程所导致的死锁问题
- Windows下解决TerminateThread终止线程导致死锁问题
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- 工作线程中调用MFC资源导致死锁
- 线程中死锁的问题
- 终止线程两个函数:ExitThread 和 TerminateThread
- 两个终止线程函数:ExitThread 和 TerminateThread
- 线程终止的问题
- Plugin调用SQL存储过程导致死锁的问题
- J2me中终止线程问题
- DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析
- DllMain中不当操作导致死锁问题的分析--进程对DllMain函数的调用规律的研究和分析
- 终止线程两个函数:ExitThread() 和 TerminateThread()
- HDU 1712 ACboy needs your help(分组背包)
- 最大子矩阵问题
- c#委托事件
- linux gcc编译多个源文件的方法
- Win7平台VS2010安装Visual Assist X
- vc中调用TerminateThread终止线程所导致的死锁问题
- cocos2d-x笔记
- 不小心把终端的字弄的很小
- Oracle EBS R12 - 如何取得EBS某个文件的版本号
- VC单文档视图刷新抖动
- Android中的AnimationSet使用
- onconfigurationchanged with listview
- GridView 转EXCEL 代码
- Linux下makefile教程