调用TerminateThread终止线程所导致的死锁问题
来源:互联网 发布:2017淘宝客程序哪个好 编辑:程序博客网 时间:2024/05/16 16:08
程序中调用TerminateThread强制终止子线程,结果导致程序死锁。
子线程和主线程都使用了一个临界区变量。主线程创建子线程时,会调用临界区,从而对临界区加锁。子线程运行过程中也会对临界区加锁。这原本是不会导致任何问题的。
为了便于管理临界区,我定义了一个自动锁的类。CAutoLock自动锁,调用构造函数时,加锁,调用析构函数时,解锁。子线程中,就定义了自动锁的对象。——这个自动锁的对象,使用的是栈。
当子线程退出时,应该是解锁了! 即使子线程异常终止,只要栈内存被回收,那么也可以解锁的!因为,回收栈的时候,会调用自动锁对象的析构函数!
这么处理,一直都没有问题。但是,这次却出现了死锁!(和以往不同的是,这次开启了1900多个子线程。)
调试结果显示,临界区处于锁定状态,没有解锁!而锁的拥有者是一个已经终止的线程!
由此得出结论:TerminateThread终止线程后,堆栈没有被回收!
当我推出这样的结论时,很快就想到了MSDN上面的说明。以前看到MSDN关于TerminateThread函数的说明,其中提到,TerminateThread结束线程时,不会回收线程的栈!
对于MSDN中的这句话,我一直当它不存在。因为以往的分析结果,TerminateThread结束线程后,栈资源似乎被回收了,栈变量的析构函数被调用了!如果是这样的话,TerminateThread基本上是安全的!至少,对于线程函数局部变量的声明和回收,是安全的!而new的内存,自然还是需要手动回收的了。
但是,这次得出的结论,证明MSDN所说属实.
- 调用TerminateThread终止线程所导致的死锁问题
- vc中调用TerminateThread终止线程所导致的死锁问题
- Windows下解决TerminateThread终止线程导致死锁问题
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- DllMain中不当操作导致死锁问题的分析——线程中调用GetModuleFileName、GetModuleHandle等导致死锁
- 终止线程两个函数:ExitThread 和 TerminateThread
- 两个终止线程函数:ExitThread 和 TerminateThread
- 线程终止的问题
- Plugin调用SQL存储过程导致死锁的问题
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- DllMain中不当操作导致死锁问题的分析--线程退出时产生了死锁
- 终止线程两个函数:ExitThread() 和 TerminateThread()
- 线程死锁的问题
- 关于线程的终止问题
- 关于SIGPIPE导致进程终止的问题
- 工作线程中调用MFC资源导致死锁
- 一种不会导致资源泄露的“终止”线程的方法
- 几种排序的直观解释
- 笔试智力题~~~
- Hadoop WordCount 运行
- JAVA自定义标签教程及实例代码
- 今夜无人入眠 - [感悟•人生]
- 调用TerminateThread终止线程所导致的死锁问题
- 那年的项目 - [Happy•Working]
- cocos2d-x 第一篇
- 给Team的一段话 - [Happy•Working]
- Openfire 的安装和配置
- DHCP option 52, Option Overload
- webservice服务接口不通诊断
- ssh整合web导出excel案例
- 将花生壳移植到ARM Linux下