关于c++杀线程函数TerminateThread强烈不建议使用

 TerminateThread强烈不建议使用,因为这个函数的执行是异步的,你无法保证调用之后会立即退出,同时线程的堆栈均不会被销毁,导致内存泄露。如果调用了这个函数,请确保使用WaitForSingleObject来等待线程对象的结束。  参考链接:https://blog.csdn.net/kofandlizi/article/details/6458011https…

大家好,又见面了,我是你们的朋友全栈君。

 

TerminateThread强烈不建议使用,因为这个函数的执行是异步的,
你无法保证调用之后会立即退出,同时线程的堆栈均不会被销毁,
导致内存泄露。如果调用了这个函数,请确保使用WaitForSingleObject来等待线程对象的结束。
 

 

参考链接:

https://blog.csdn.net/kofandlizi/article/details/6458011

https://blog.csdn.net/shanzhizi/article/details/7731821

 

ThreadHandle = CreateThread(NULL,0,…..);
CloseHandel(ThreadHandle );//不会直接关闭线程,只是递减线程中的内核对象使用计数。当使用计数为0时,释放内核对象

 

一、Createthread:创建线程后如何回收

1.线程的生命周期就是线程函数从开始执行到return,这时候线程就自动回收了

2.而线程句柄是一个内核对象。我们可以通过句柄来操作线程,句柄生命周期是从CreateThread返回到你CloseHandle(),closehandle后便释放句柄(如果不closehandle句柄资源很快用光)

3.关闭一个句柄对象,表示不再使用该句柄操作线程(即不对线程做任何干预),但不会释放线程,线程释放按上述1其生命周期完成。

4.句柄操作线程例子,如WaitForSingleObject(ThreadHandle,1000)为等待线程1s的操作,假设判断10s后为线程超时的情况,不必调用TerminateThread杀线程,等其线程生命周期结束return即可

 

二、调用TerminateThread杀线程的致命问题:

TerminateThread终止线程后,堆栈没有被回收(注意连栈都没有被回收)

整个进程在分配和回收内存时,占用同一把锁,如果一个线程在使用该锁时被杀死(即临死前该线程在new或delete操作中),则其他线程就无法再使用new或delete了,表现为hang住

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

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

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

相关推荐

  • UpdatePanel Control

    UpdatePanel Control原帖地址:http://www.cnblogs.com/caviare/archive/2007/09/21/901500.html另外关于UpdateProgress和Timer控件的使用,可以参考http://read.newbooks.com.cn/info/168590.html UpdatePanel  对于UpdatePanel控件的使用是ASP.N

    2022年7月23日
  • linux下crontab命令的用法,linux 定时任务crontab用法详解「建议收藏」

    linux下crontab命令的用法,linux 定时任务crontab用法详解「建议收藏」linux定时任务crontab用法详解linux中crontab命令用于设置周期性被执行的指令,该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。cron系统调度进程。可以使用它在每天的非高峰负荷时间段运行作业,或在一周或一月中的不同时段运行。cron是系统主要的调度进程,可以在无需人工干预的情况下运行作业。crontab命令允许用户提交、编辑或删除相应…

    2022年8月24日
  • Oracle数据库常用Sql语句大全

    Oracle数据库常用Sql语句大全最简单的就是查询:select语句数据库操作语言DML:update、insert、delete等数据库定义语言DDL:create、drop、alter等等oracle取前几条数据语句sqlserver中可以用topn的方法,oracle中用rownum,但如果只用rownum会随机取数据,如果想按一定顺序取前几条数据则可这样写:select*from(select列from表where条件orderby列desc)whererownum<>sel

    2022年5月12日
  • jrebel 无效无法更换lisence

    jrebel 无效无法更换lisence

    2020年11月19日
  • WINDOWS 1.0模拟器_modelsim激活成功教程版安装教程

    WINDOWS 1.0模拟器_modelsim激活成功教程版安装教程本教程包括软件下载、激活成功教程文件下载、安装激活成功教程方法,助你一次成功。 软件安装好了却不能用,想必大家都有过这样的痛苦和无奈。这款软件的激活成功教程花了我整整一个下午的时间,期间在网上找了各种方法尝试均以失

    2022年8月3日
  • 万字长文,带你深入理解AQS 队列同步器

    点击上方“全栈程序员社区”,星标公众号 重磅干货,第一时间送达 作者:zhenchao zhenchao.org/2018/08/24/java/juc-aqs/ Abstract…

    2021年6月28日

发表回复

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

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