不要轻易使用TerminateThread中止线程
来源:互联网 发布:mac 返回上一级目录 编辑:程序博客网 时间:2024/04/29 11:31
听过无数次不要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,作为网络不通时的退出机制,以后要改改了。比如让该线程自生自灭,自行退出。
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/fatacy/archive/2009/08/17/4456049.aspx
ExitThread是推荐使用的结束一个线程的方法,当调用该函数时,当前线程的栈被释放,然后线程终止,相对于TerminateThread函数来说,这样做能够更好地完成附加在该线程上的DLL的清除工作
原文地址:http://anwj336.blog.163.com/blog/static/8941520920099180475773/
- 不要轻易使用TerminateThread中止线程
- 不要轻易使用TerminateThread中止线程
- 尽量不要使用TerminateThread与SuspendThread
- 绝对绝对不要TerminateThread
- 不要轻易相信,更不要轻易否定
- [转]绝对绝对不要TerminateThread
- ICloneable 的方法实现 不要轻易使用ICloneable
- 请不要轻易发脾气
- 不要轻易选择放弃!!
- 千万不要轻易退保
- 不要轻易说“不”
- 不要轻易说“不”
- 不要轻易下结论
- 不要轻易卖出!
- 不要轻易许下承诺
- 不要轻易考验人性
- 年轻时不要轻易放弃
- 不要轻易许诺
- Windows下的SVN服务器安装及配置
- MP4 ESDS
- JAVA竖线转义符号
- autobook 中文版 (三)
- 设置Win8防火墙规则 顺畅访问局域网tomcat服务
- 不要轻易使用TerminateThread中止线程
- LOTUS DOMINO邮件服务器升级迁移
- 英特尔拟推出配备摄像头的机顶盒
- ubuntu 安装ncurses
- 【Android开发学习15】Android OpenGL ES 纹理映射之glDrawArrays
- 笔记_注解
- sql语句2
- XXX.class.getResource()与XXX.class.getClassLoader().getResource(url)研究
- hdoj1197简单题