不要轻易使用TerminateThread中止线程
来源:互联网 发布:狮王手柄编程软件 编辑:程序博客网 时间:2024/06/11 21:08
听过无数次不要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,作为网络不通时的退出机制,以后要改改了。比如让该线程自生自灭,自行退出。
ExitThread是推荐使用的结束一个线程的方法,当调用该函数时,当前线程的栈被释放,然后线程终止,相对于TerminateThread函数来说,这样做能够更好地完成附加在该线程上的DLL的清除工作
- 不要轻易使用TerminateThread中止线程
- 不要轻易使用TerminateThread中止线程
- 尽量不要使用TerminateThread与SuspendThread
- 绝对绝对不要TerminateThread
- 不要轻易相信,更不要轻易否定
- [转]绝对绝对不要TerminateThread
- ICloneable 的方法实现 不要轻易使用ICloneable
- 请不要轻易发脾气
- 不要轻易选择放弃!!
- 千万不要轻易退保
- 不要轻易说“不”
- 不要轻易说“不”
- 不要轻易下结论
- 不要轻易卖出!
- 不要轻易许下承诺
- 不要轻易考验人性
- 年轻时不要轻易放弃
- 不要轻易许诺
- 找工作大事呀,得注意下(转)
- 关于生产者-消费者问题
- 后乔布斯时代Cook如何改造苹果
- 子窗体随着父窗体大小变化
- C语言中getchar()函数的理解
- 不要轻易使用TerminateThread中止线程
- UCS
- myeclipse优化设置
- linux实时更新时间
- my tx share key
- iOS5正式版相对iOS4.3的一些比较纠结的修改
- 用函数和指针实现两个数的交换
- 启示
- SQL 分类汇总 TOP n 语句