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得程序可能出现问题!)

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

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

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • show partitions 分区查询

    show partitions 分区查询前言查询的分区情况程序Jupyter#导入信息frompyspark.sqlimportSparkSession,RowfrompysparkimportSQLContextfrompyspark.sql.functionsimportudf,col,explode,collect_set,get_json_object,concat_ws,splitfrompyspark.sql.typesimportStringType,IntegerTy

    2022年6月26日
    51
  • qpython3安装pygame_详解Python pygame安装过程笔记

    qpython3安装pygame_详解Python pygame安装过程笔记今天看到一个教程,是关于Python安装pygame模块的。觉得很好,拿来分享一下。安装Python额,这个小题貌似在这里很是多余啊。但是为了照顾到刚刚学习Python的童鞋,我还是多啰嗦两句吧。具体如下:我们要到Python官网。去下载我们需要的版本。我这里下载的是windows64位的Python2.7msi。安装的过程如果不懂,选择为默认即可。安装easy_install至于这是个什么东…

    2022年5月23日
    56
  • 计算机管理照相机感叹号,电脑设备管理器摄像头驱动出现黄色感叹号是怎么回事儿 – 驱动管家…[通俗易懂]

    计算机管理照相机感叹号,电脑设备管理器摄像头驱动出现黄色感叹号是怎么回事儿 – 驱动管家…[通俗易懂]设备管理器摄像头驱动显示黄叹号安装驱动过程提示注册表损坏,出现这种情况的原因是注册表文件出现问题,解决方法如下故障现象:设备管理器摄像头驱动显示黄叹号安装驱动过程提示注册表损坏。原因分析:注册表文件出现问题。解决方案:1.点击“开始”—所有程序—打开运行;2.输入regedit(“regedit.exe”是Windows系统的注册表编辑器,是RegistryEditor的缩写。W…

    2022年8月12日
    3
  • Oracle创建表空间、创建用户的完整过程「建议收藏」

    Oracle创建表空间、创建用户的完整过程「建议收藏」我在工作学习过程中经常用到Oracle,由于经验欠缺,熟练度不足,每次都要百度一下。现在总结一下Oracle创建用户的过程,分享给大家。这里我就直接把sql语句贴出来,使用时直接复制粘贴即可。/*步骤:1、创建表空间2、创建用户3、用户授权*//*创建表空间*/createtablespaceQCJ_TABLESPACE…

    2022年7月11日
    28
  • 光纤交换机zone配置

    光纤交换机zone配置一、CentOS下查看PortName1、命令cat/sys/class/fc_host/host[N]/port_state,显示online则证明链路状态正常2、命令cat/sys/class/fc_host/host[N]/port_name,获取客户端HBA卡PortName二、AIX下查看WWNName1、查看系统中有效的光纤卡$lsdev-Ccadapter-Sa|grepfcs3、查看光纤卡WWNName$ls…

    2022年5月11日
    69
  • Delphi语言_DELPHI

    Delphi语言_DELPHI总结一下SQL语句中引号(‘)、quotedstr()、(”)、format()在SQL语句中的用法以及SQL语句中日期格式的表示(#)、(”)在Delphi中进行字符变量连接相加时单引号用(”’),又引号用(””)表示首先定义变量var AnInt:integer=123;//为了方便在此都给它们赋初值。虽然可能在引赋初值在某些情况下不对AnIntStr:str

    2022年10月18日
    0

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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