绝对绝对不要TerminateThread
来源:互联网 发布:sql视频教程 百度网盘 编辑:程序博客网 时间:2024/05/08 09:07
听过无数次不要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,作为网络不通时的退出机制,以后要改改了。比如让该线程自生自灭,自行退出。
- 绝对绝对不要TerminateThread
- [转]绝对绝对不要TerminateThread
- 绝对
- 绝对不要进入热点板块
- 绝对不要和完美主义者恋爱
- 请不要绝对相信Microsoft的代码
- 以下七种人,绝对不要借钱给TA
- 绝对经典:老婆的日记千万不要乱看!!!切记。
- 【ZT】宁可辛苦一阵子,绝对不要辛苦一辈子!
- 在建立视图的别名时绝对不要使用双引号
- 警告:绝对不要把pi转换为二进制!!!
- 绝对不要重新定义继承而来的缺省参数
- 风险未能控制的事情绝对不要轻易做
- 警告:绝对不要把pi转换为二进制!!!
- 3.绝对不要以多态方式处理数组
- 大吃大喝后,绝对不要做的5件事
- 图片要启用gzip压缩吗?绝对不要!
- 条款3:绝对不要以多态方式处理数组
- VC2005:无法执行添加/移除操作,因为代码元素是只读的
- 修改centos服务器默认语言
- Java程序员到架构师的推荐阅读书籍
- 三头小猪等于一个“唐僧”
- JBoss Tools安装
- 绝对绝对不要TerminateThread
- IE6下DIV最小高度不能为0的解决方法
- CentOS下(Tomcat5)Servlet/JSP服务器的构建
- eclipse下JVM terminated. Exit code=-1的解决方法
- ms sql日期和时间格式获取
- 图灵“微软四大技术秘籍”近期出版!
- Linux下Socket编程
- Hadoop部署笔记
- 凸包公式