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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • executescalar mysql_ExecuteScalar

    executescalar mysql_ExecuteScalar这两个答案和一点点思考使我想到了一个接近答案的东西。首先再澄清一下:该应用程序是用C#(2.0+)编写的,并使用ADO.NET与SQLServer2005进行通信。镜像设置是托管主体和镜像的两个W2k3服务器以及托管作为监视器的快速实例的第三个服务器。这样做的好处是,故障转移对于使用数据库的应用程序几乎是透明的,它将对某些连接引发错误,但从根本上讲一切都会很好地进行。是的,我们得到了奇怪的误报…

    2022年6月30日
    24
  • 微信开放平台 微信登录-扫码登录[通俗易懂]

    微信开放平台 微信登录-扫码登录[通俗易懂]需求:后台需要添加微信扫码登录,要求能跟小程序用户绑定,同步用户信息。

    2022年5月15日
    68
  • java trylock_lock.tryLock()方法的使用

    java trylock_lock.tryLock()方法的使用packageconcurrent;importjava.util.ArrayList;importjava.util.List;importjava.util.concurrent.locks.Lock;importjava.util.concurrent.locks.ReentrantLock;publicclassTestTryLock{privateListlist=…

    2022年10月16日
    4
  • pycharm调试远程主机_服务终端

    pycharm调试远程主机_服务终端我们有时为了方便,可能需要用到pycharm中的终端功能进行服务器端调试。在将pycharm配置远程开发后,我们点开Terminal终端功能,默认是本地的终端,如下图。如果要使用远程的终端,非常简单,因为已经配置过远程的解释器,我们点开Tools里的startSSHsession功能,即可选择服务器端的终端功能按图示选择完后,就可以直接使用服务器端的终端功能了,不需要额外的SSH工具显…

    2022年8月28日
    5
  • html表格基础及案例示图代码。[通俗易懂]

    html表格基础及案例示图代码。[通俗易懂]html的表格基础事例图片及代码

    2022年7月15日
    17
  • 数据库设计实战(一):数据库设计规范「建议收藏」

    数据库设计实战(一):数据库设计规范「建议收藏」一、数据库设计流程1、需求分析确定用户对数据库系统的使用要求和各种约束条件,形成用户需求规约2、概念设计对用户要求描述的现实世界,通过对其分类、聚集和概括,建立抽象的概念数据模型3、逻辑设计将现实世界的概念数据模型设计成数据库的一种逻辑模式,即适应于某种特定数据库管理系统所支持的逻辑数据模式4、物理设计对具体的应用任务选定最合适的物理存储结构、存取方法和存取路径等5、验证设计在其他设计基础上,收集数据并具体建立一个数据库,运行一些典型的应用任务来验证数据库设计的正确性

    2022年7月12日
    19

发表回复

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

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