博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
TerminateThread危险
阅读量:6642 次
发布时间:2019-06-25

本文共 1824 字,大约阅读时间需要 6 分钟。

TerminateThread is a dangerous function that should only be used in the most extreme cases. You should call TerminateThread only if you know exactly what the target thread is doing, and you control all of the code that the target thread could possibly be running at the time of the termination. For example, TerminateThread can result in the following problems:

  • If the target thread owns a critical section, the critical section will not be released.(未释放互斥区,造成死锁)
  • If the target thread is allocating memory from the heap, the heap lock will not be released.(未释放堆分配锁,造成死锁)
  • If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread’s process could be inconsistent.(在执行内核函数时退出,造成该线程所在进程状态不确定,程序可能崩溃)
  • If the target thread is manipulating the global state of a shared DLL, the state of the DLL could be destroyed, affecting other users of the DLL.(在使用DLL时退出,造成DLL被销毁,其他使用该DLL得程序可能出现问题!)

A thread cannot protect itself against TerminateThread, other than by controlling access to its handles. The thread handle returned by the CreateThread and CreateProcess functions has THREAD_TERMINATE access, so any caller holding one of these handles can terminate your thread.

 

 

 

听过无数次不要TerminateThread,只是工作中常用,貌似也没有什么问题。今天在高强度测试中发现了一个不可原谅的错误。参看下面的例子

 

DWORD __stdcall mythread(void* )
{
    while( true )
    {
        char* p = new char[1024];
        delete p;
    }
}

int _tmain(int argc, _TCHAR* argv[])
{
    HANDLE h = CreateThread(NULL, 0, mythread, NULL, 0, NULL);
    Sleep(1000);
    TerminateThread(h, 0);
    h = NULL;
    char* p = new char[1024]; //这里会死锁,过不去 
    delete []p;
    return 0;
}
为什么死锁呢?new操作符用的是小块堆,整个进程在分配和回收内存时,都要用同一把锁。如果一个线程在占用该锁时被杀死(即临死前该线程在new或delete操作中),其他线程就无法再使用new或delete了,表现为hang住。

《核心编程》里明确提醒不要TerminateThread,但原因并不是血淋淋滴。今天发现的这个bug印证了此书的价值。

另注:许多临时的网络操作经常用TerminateThread,作为网络不通时的退出机制,以后要改改了。比如让该线程自生自灭,自行退出。

转载地址:http://nbovo.baihongyu.com/

你可能感兴趣的文章
监控SQL Server事务复制
查看>>
解决Linux下sqlplus中文乱码问题
查看>>
普华永道:2017年全球信息安全状况调查分析
查看>>
互联网公司的项目经理:别轻易脚踩两只船
查看>>
WSUS服务器的详细配置和部署
查看>>
添加社交网络到您的站点(Adding Social Networking to Your Website)
查看>>
linux运维实战练习-2015年8月30日课程作业(练习)安排
查看>>
谈谈自己的web开发经历(一):初识web开发
查看>>
在制作WORD小报时添加艺术横线或者艺术竖线
查看>>
酷派发布新品牌ivvi,精品手机市场格局再变
查看>>
新浪微博传播途径研究
查看>>
为什么你的网站不到赚钱?原因都在这里了
查看>>
应用系统中常见报表类型解析
查看>>
Hyper-V 3 虚拟机快照之三 应用和删除快照
查看>>
一例所有文件都打不开的数据恢复过程
查看>>
SCCM2012 SP1客户端请求方式安装64Bit windows7失败
查看>>
安全威胁情报实战
查看>>
SQL Server 备份场景示例
查看>>
.NET深入解析LINQ框架(五:IQueryable、IQueryProvider接口详解)
查看>>
ASP.NET MVC4+BootStrap 实战(二)
查看>>