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)


相关推荐

  • Vs2010_labview读取CPU序列号

    Vs2010_labview读取CPU序列号   用VS2008有些日子,刚刚才发现AboutMVS是有天数限制的(90),郁闷,只好在网上找序列号,不错,把刚刚找到的VS2008可升级序列号发给大家。          1.VisualStudio2008ProfessionalEdition:     XMQ2Y-4T3V6-XJ48Y-D3K2V-6C4WT      2.VisualStudio2008

  • idea在mac版怎么配置svn_idea配置svn的步骤

    idea在mac版怎么配置svn_idea配置svn的步骤之前一直使用的是eclipse和myEclipse,然后最近使用了idea最为开发工具。说实话,本人偏向于使用idea,但是因为长时间使用eclipse的原因,使用idea确实需要一个过程去适应,尤其是快捷键。今天先简述一下idea配置管理工具svn的过程。1.需要再本地安装一个svn插件,有很多人选择用小乌龟,而本人因为某些原因不是很喜欢小乌龟,所以选择了另外一个,叫做silkSvn。所以要先去…

  • 使用cdn实现免备案_阿里云备案的域名可以在腾讯云用吗

    使用cdn实现免备案_阿里云备案的域名可以在腾讯云用吗昨晚在QQ群看到的,目前可以白嫖!无视阿里云给你分配的cname地址域名直接解析到发的那些cname地址上面就可以使用了!添加CDN,加速区域选择“全球(不含中国大陆)”,然后把域名解析到阿里云国内CDN节点IP上。注意:知道的人多了或者也许会失效!这是我的网站测试的结果可以访问看一下速度:爱云影视…

  • iso配置yum源[通俗易懂]

    iso配置yum源[通俗易懂]iso配置yum源:1、上传iso文件;2、mount挂载iso文件:mount-oloop-tiso9660/opt/rhel-server-.iso/mnt/iso3、配置/etc/yum.repos.d目录下的repo文件,注意备份系统原有的repo文件[iso]name=isobaseurl=file:///mnt/isogpgkey=file:///mnt/iso/RPM-GPG-KEY-redhat-betafailovermethod=priorit

  • WeakHashMap

    WeakHashMapWeakHashMap,此种Map的特点是,当除了自身有对key的引用外,此key没有其他引用那么此map会自动丢弃此值,见实例:此例子中声明了两个Map对象,一个是HashMap,一个是WeakHashMap,同时向两个map中放入a、b两个对象,当HashMap remove掉a并且将a、b都指向nu…

发表回复

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

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