[转]绝对绝对不要TerminateThread
来源:互联网 发布:浏览器默认端口号80 编辑:程序博客网 时间:2024/05/16 09:21
听过无数次不要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://blog.csdn.net/fatacy/article/details/4456049
- [转]绝对绝对不要TerminateThread
- 绝对绝对不要TerminateThread
- 绝对
- 绝对不要进入热点板块
- 绝对不要和完美主义者恋爱
- 请不要绝对相信Microsoft的代码
- 以下七种人,绝对不要借钱给TA
- 绝对经典转帖
- 转:绝对搞笑
- 绝对经典:老婆的日记千万不要乱看!!!切记。
- 【ZT】宁可辛苦一阵子,绝对不要辛苦一辈子!
- 在建立视图的别名时绝对不要使用双引号
- 警告:绝对不要把pi转换为二进制!!!
- 绝对不要重新定义继承而来的缺省参数
- 风险未能控制的事情绝对不要轻易做
- 警告:绝对不要把pi转换为二进制!!!
- 3.绝对不要以多态方式处理数组
- 大吃大喝后,绝对不要做的5件事
- 求质数因子
- dos下有关目录的部分命令
- IOS 很多控件的讲解
- (34)数组的相关处理函数(上)(35)常用的数组相关操作函数(下)
- 博弈论学习总结(一)
- [转]绝对绝对不要TerminateThread
- 仿新浪微博的ListView下拉更新功能
- 常用邮箱的服务器名
- Qt中QTeeWidget的简单使用
- PKI系统深入介绍
- oracle 设置主键、修改列等sql语句(转载)
- 深圳试行短信打印交通违法罚款单
- 数据结构 A 撞来撞去的圆圆的东西
- [转]让程序只运行一个实例的四种方法