创建线程是否调用CloseHandle

摘要:
关于是否在创建线程后调用Closehandle一直困惑,今天查了查,才明白。CloseHandle关闭句柄并没有终止新创建的线程。所以应该在不再使用线程的句柄的时候将其关闭掉,让线程的线程内核对象的引用计数减1Closingathreadhandledoesnotterminatetheassociatedthread.Toremoveathreadobject,youmustterminatethethread,andthencloseallhandlestothethread.MSDN上的一句话!主线程没有任何特殊性,主线程退出并不会导致它所创建的线程退出!这是因为我们大部分的程序都是Link了微软的CRT,主函数由它导入,当main函数结束的时候,CRT会叫到:ExitProcess于是所有的线程都同归于尽了。

关于是否在创建线程后调用Closehandle一直困惑,今天查了查,才明白。

CloseHandle关闭句柄并没有终止新创建的线程。只是表示对新创建的线程的引用不敢兴趣,系统会递减新线程的线程内核对象的使用计数。当使用计数为0的时候,系统就会释放线程内核对象。如果在主线程中没有关闭线程的句柄,始终都会保留一个引用。这样线程内核对象的引用计数就不会为0。即使新线程执行完毕,线程内核对象也不会被释放,只有等到进程终止的时候系统才会为残留的对象做清理工作。所以应该在不再使用线程的句柄的时候将其关闭掉,让线程的线程内核对象的引用计数减1
Closingathreadhandledoesnotterminatetheassociatedthread.Toremoveathreadobject,youmustterminatethethread,andthencloseallhandlestothethread.
MSDN上的一句话!

主线程没有任何特殊性,主线程退出并不会导致它所创建的线程退出!

在Windows上,所有的线程都是平等的,其实没有什么主线程和和从属线程的区别。你可能会说:你说的不对,我的主线程结束了,我的程序就退出了。这是因为我们大部分的程序都是Link了微软的CRT,主函数由它导入,当main函数结束的时候,CRT会叫到:
ExitProcess
于是所有的线程都同归于尽了。你感觉上好像其他线程都是主线程给弄没的。如果你不用CRT,或者是直接用汇编,主线程退出的时候不影响其他的线程。

CreateThread需要手动调用CloseHandle关闭句柄
beginthread开启的线程,在调用_endthread时候会自动关闭句柄
beginthreadex需要手动关闭句柄
如下:
CreateThread、ExitThread不适用于使用了CRT环境的C语言
_beginthread、_endthread适用于CRT环境,但强烈建议使用ex系列函数代替(_endthread函数会直接关闭线程句柄)
_beginthreadex、_endthreadex适用于CRT环境
AfxBeginThread、AfxEndThread适用于MFC环境

就算CloseHandle(hThread)但是这个线程没有return之前仍然会继续运行
你CloseHandle后只是对该资源计数器进行--操作当--到0后系统将其回收
如果每次CreateThread后均不CloseHandle将造成内存不足

引用源:http://bbs.csdn.net/topics/120009459

免责声明:文章转载自《创建线程是否调用CloseHandle》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Delphi与Windows 7下的用户账户控制(UAC)机制(加小盾牌),注册表没反应fso操作大全下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

关于对JMM(java内存模型)的个人理解

java内存模型是一种虚拟机规范,它定义了Java内存模型,用于屏蔽各种不同硬件和操作系统访问内存差异,以实现让java程序在各种平台下都能达到一致的并发效果.JMM规范了java虚拟机与计算机内存是如何协同工作的,规定了一个线程如何和何时可以看到由其他线程修改过后的共享变量的值,以及在必须时如何同步的访问共享变量. 关于主内存与工作内存之间的具体交互协...

阿里P6初面Java面试题,附带完整答案,赶紧搜藏

最强面试题推荐: 2020Java面试题及答案,命中率高达90% 1、锁可以锁在哪里? Java 为程序加锁的方式主要有两种:synchronized 与 Lock。 1. synchronized 可以修饰的作用域如下: - 非静态方法(加的锁为对象锁); - 静态方法(加的锁为类锁); - 代码块(对象锁与类锁均可); 2. Lock 采用 lock(...

线程及视频解码过程6-16

线程 一、为了让音视频更好的解码,这里我们需要采用多线程,用一个线程解码视频,一个线程解码音频,我们需要: 1.调用线程库 #include <thread> 2.std:thread t1(); 创建相应线程。 3、为了让每个线程更好的区分资源属于哪一个线程,我们可以用类来实现线程,在对应得类中用成员来区分。 例如:      通过新建一个...

HTML5触屏版多线程渲染模板技术分享

  前言: 了解js编译原理的屌丝们都知道,js是单线程的,想当年各路神仙为了实现js的多线程,为了解决innerHTML输出大段HTML卡页面的顽疾,纷纷设计了诸如假冒的“多线程“实现,我自己也在写开源框架KitJs时候,写过类似的组件http://www.cnblogs.com/xueduanyang/archive/2012/05/30/252642...

Jmeter做接口测试

Jmeter操作手册以获取微信公众号access_token为例 一、操作步骤 创建集合,集合名可以是项目名称,这里改为“微信公众号测试” 创建一个线程组,命名为获取access_token 创建一个请求,命名为获取access_token 在接口文档里面获取信息,填写协议类型、服务器名称或ip、HTTP请求方法、路径,端口号默认,因为是GEt方...

jprofiler主要功能简介及内存泄漏分析示例

转:https://blog.csdn.net/huangjin0507/article/details/52452946 一、安装JProfiler        从http://www.ej-technologies.com/下载5.1.2并申请试用序列号   二、主要功能简介 1.内存剖析 Memory profiler JProfiler 的内...