TerminateThread可能导致程序崩溃

TerminateThread可能导致程序崩溃DWORD__stdcallmythread(void*){   while(true)   {      char*p=newchar[1024];      deletep;   }}int_tmain(intargc,_TCHAR*argv[]){   HANDLEh=CreateThread(NULL,0,mythread,N…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全家桶1年46,售后保障稳定

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,作为网络不通时的退出机制,以后要改改了。比如让该线程自生自灭,自行退出。

 

    可能引发的问题包括: 1 If the target thread owns a critical section, the critical section will not be released. (未释放互斥区,造成死锁) 2 If the target thread is allocating memory from the heap, the heap lock will not be released. (未释放堆分配锁,造成死锁) 3 If the target thread is executing certain kernel32 calls when it is terminated, the kernel32 state for the thread’s process could be inconsistent. (在执行内核函数时退出,造成该线程所在进程状态不确定,程序可能崩溃) 4 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得程序可能出现问题!)

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/227266.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • .apk反编译_apk反编译教程

    .apk反编译_apk反编译教程原文作者:[color=blue][b]lpohvbe[/b][/color]原文地址:[url]http://blog.csdn.net/lpohvbe/article/details/7981386[/url]本人接触不久,有错误望请各位神牛不吝赐教,仅仅希望把自己这段时间研究的东西分享一下,如果可以帮助到有需要的童鞋万感荣幸。欢迎评论转载,但请加上转载来源谢谢!请尊重开发者劳动成果!…

  • JBPM学习第4篇:10分钟熟悉Eclipse[通俗易懂]

    JBPM学习第4篇:10分钟熟悉Eclipse

  • WEBAPP开发技巧总结

    WEBAPP开发技巧总结自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联网界从此就多了一个新的名词-WebApp(意为基于WEB形式的应用程序,运行在高端的移动终端设备)。开发者们都知道在高端智能手机系统中有两种应用程序:一种是基于本地(操作系统)运行的APP;一种是基于高端机的浏览器运行的WebApp,本文将主要讲解后者。WebApp与Native App有何区别呢?Nat

  • android 小米pad 调试,小米平板2 开启USB调试模式「建议收藏」

    android 小米pad 调试,小米平板2 开启USB调试模式「建议收藏」我们要将小米平板2与电脑进行连接,就必须要打开小米平板2系统的调试模式,不同的系统版本打开调试模式的方法有所不同,在这里我们就谈谈小米平板2各种系统版本打开USB调试模式的方法。1、针对Android2.1-2.2版本的系统:我们在桌面按小米平板2手机上的“菜单键”会弹出菜单,点击“设置”选项进入系统的设置菜单列表,然后进入“应用程序”—“开发”,就可以看到“USB调试”选项,我们勾选即可…

  • nslookup两种错误解决方法

    nslookup两种错误解决方法

  • Pycharm和Pytorch安装教程配置环境以及遇到的问题:

    Pycharm和Pytorch安装教程配置环境以及遇到的问题:Pycharm和Pytorch安装教程配置环境以及遇到的问题:注意:我们每次新建完项目,都要检查一下python解释器和conda.exe是否选择正确。一.如何找到Anconda哪个环境中安装了pytorch?Anconda提供环境,我们安装pytorch也是在一个环境下,所以不是在每个环境中都能用pytorch。那么我们如何找到我们pytorch安装的环境呢?要有NVDIA的显卡,才能用CUDA(AMD的小伙伴可能泪目了),查CUDA的版本比较简单,就不总结了。打开Anconda,输入conda

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号