很多程序在创建线程都这样写的:

。。。
ThreadHandle = CreateThread(NULL,0,.....);
CloseHandle(ThreadHandle );
。。。。
这不是刚好创建又关闭了吗?线程怎么运行呢?

================================================

Closing a thread handle does not terminate the associated thread. To remove a thread object, you must terminate the thread, then close all handles to the thread.

================================================

1,线程和线程句柄(Handle)不是一个东西,线程是在cpu上运行的.....(说不清楚了),线程句柄是一个内核对象。我们可以通过句柄来操作线程,但是线程的生命周期和线程句柄的生命周期不一样的。线程的生命周期就是线程函数从开始执行到return,线程句柄的生命周期是从CreateThread返回到你CloseHandle()。

2,所有的内核对象(包括线程Handle)都是系统资源,用了要还的,也就是说用完后一定要closehandle关闭之,如果不这么做,你系统的句柄资源很快就用光了。

3,如果你CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了在CloseHandle。如果你开了一个线程,而不需要对它进行如何干预,CreateThread后直接CloseHandle就行了。
所以CloseHandel(ThreadHandle );只是关闭了一个线程句柄对象,表示我不再使用该句柄,即不对这个句柄对应的线程做任何干预了。并没有结束线程。

如果你觉得多了一个变量,也可以写为:
CloseHandel(CreateThread(NULL,0,.....));

================================================================

《windows核心编程》上说调用closehandle(HANDLE)表示创建者放弃对该内核对象的操作。如果该对象的引用对象记数为0就撤消该对象。

====================================================================

在线程创建后马上调用CloseHandle()是个良好的做法,这里不会影响线程的执行,就是因为即使你close了这个handle,它的内部记数也不为零.   但如果你不关,在线程结束后,那个线程对象将滞留于内存中,也就是说你有handle   leak.   
    
  返回这个handle给你,是让你有机会对这个线程实施外部动作,诸如waitforsingleobject之类.

==================================================================

CloseHandle的功能是关闭一个打开的对象句柄,该对象句柄可以是线程句柄,也可以是进程、信号量等其他内核对象的句柄,而ExitThread的功能是终止一个线程,它所接受的参数是一个线程的退出码。   
    
  通过调用CloseHandle可以告知系统,已经完成了对某一内核对象的操作,该函数首先检查调用进程的句柄表,来确认进程是否对该句柄所指向的对象有访问权,如果句柄无效则返回FALSE,如果有效,系统将得到该内核对象的数据结构的地址,把结构中的使用计数成员减1,如果计数变为0,则将从内核中释放该内核对象。   
    
  如果计数还未到0,就意味着还有其他的进程在使用这个内核对象,那么它就不会被释放。   
    
  ExitThread是推荐使用的结束一个线程的方法,当调用该函数时,当前线程的栈被释放,然后线程终止,相对于TerminateThread函数来说,这样做能够更好地完成附加在该线程上的DLL的清除工作。   
    
  如果需要进一步的信息,您可以参看:   
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/handobj_289x.asp   
  和http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/prothred_531g.asp   
  等有关的MSDN信息。

==================================================================

线程作为一种资源创建后不只被创建线程引用,我想系统自身为了管理线程也会有一个引用,所以用户线程释放线程句柄后,引用计数也不会是零。引用计数是资源自我管理的一种机制,资源本身以引用计数为零来得知别人不再需要自己,从而把自己kill掉。

=================================================================

CreateThread后那个线程的引用计数不是1,调用CloseHandle只是说自己对这个线程没有兴趣了,线程还是正常运行的

=================================================================

CreateThread后那个线程的引用计数不是1,而是2。   
    
  creating   a   new   process   causes   the   system   to   create   a   process   kernel   object     
  and   a   thread   kernel   object.   At   creation   time,   the   system   gives   each   object     
  an   initial   usage   count   of   1.   Then,   just   before   CreateProcess   returns,   the     
  function   opens   the   process   object   and   the   thread   object   and   places   the     
  process-relative   handles   for   each   in   the   hProcess   and   hThread   members   of     
  the   PROCESS_INFORMATION   structure.   When   CreateProcess   opens   these   objects     
  internally,   the   usage   count   for   each   becomes   2.

=================================================================

创建新的进程后,记数初始化为1,而函数需要返回进程内核对象的句柄,相当于打开一次新创建的类核对象,记数再加1

From:http://www.cnblogs.com/cryinstall/archive/2011/08/06/2280830.html

转载于:https://www.cnblogs.com/jinxiang1224/p/8468342.html

对CloseHandle用法的理解相关推荐

  1. css .clearfix,css之clearfix的用法深入理解(必看篇)

    如果有一个DIV作为外部容器,内部的DIV如果设置了float样式,则外部的容器DIV因为内部没有 clear,导致不能被撑开.看下面的例子: Div布局如下: Css代码如下: CSS Code复制 ...

  2. innerHtml的用法及理解

    innerHtml的用法及理解 理解: 对于innerHTML 属性,几乎所有的元素都有innerHTML属性,它是一个字符串,用来设置或获取位于对象起始和结束标签内的HTML(包括html标签以及里 ...

  3. java this self_[原]Javasript 关于self(that) = this用法的理解

    断断续续学历nodejs也有半年时间了,对于Javascript也是慢慢了解中. 最近看道爷的Javascript Good Parts中,里面有提到函数调用模式的时候,出现了var that = t ...

  4. numpy中stack的用法直观理解

    首先生成一些数, import numpy as np a = np.arange(1, 7).reshape((2, 3)) b = np.arange(7, 13).reshape((2, 3)) ...

  5. c语言private用法,深入理解C++中public、protected及private用法

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...

  6. c语言中public 用法,深入理解C++中public、protected及private用法

    初学C++的朋友经常在类中看到public,protected,private以及它们在继承中表示的一些访问范围,很容易搞糊涂.今天本文就来十分分析一下C++中public.protected及pri ...

  7. (转载)谈谈JS里的{ }大括号和[ ]中括号的用法,理解后就可以看懂JSON结构了。...

    转载 http://hi.baidu.com/langshen/item/a52c580ab16d2c31a2332ae2 一.{ } 大括号,表示定义一个对象,大部分情况下要有成对的属性和值,或是函 ...

  8. php会话控制区别和流程,PHP会话控制:cookie和session区别与用法深入理解_后端开发...

    PHP Swoole 基本使用_后端开发 Swoole是php的一个异步.并行.高性能的网络通信引擎,可以用Swoole做一些想http.websocket的服务器,Swoole提供了异步多线程服务器 ...

  9. CSS-Position用法的理解

    CSS语法中,对于position的使用一直搞不清楚,特写此博客,帮助自己理解和记忆 gitHub地址: https://github.com/thinkingfioa/ CSS中的定位(positi ...

最新文章

  1. 开源社区的危机:拒绝被“白嫖”?2大著名项目遭作者破坏
  2. m-orchastration system
  3. 关于时间类型数据的转换
  4. 自考护理学计算机考试时间,护理学专业2019年10月江苏自考科目及考试时间安排...
  5. TI公司dsp的cmd配置文件的说明
  6. [Win10]鼠标没用,插入USB口电脑提示USB Optical Mouse找不到驱动程序的解决方案
  7. linux 系统、命令、软件
  8. Search Engine XSS Worm
  9. notepad++与ISE/Vivado关联
  10. 数据库设计中的14个技巧(转载)
  11. python 可视化界面 打开excel_python如何将excel数据处理可视化
  12. vue3的语法使用总结api
  13. 微信开发者工具下载使用
  14. t60整了个vista!!感觉不错!
  15. 放弃国企工作、花2万参加培训班,只为挤进互联网大厂
  16. C++语法(五)数据类型
  17. 尚硅谷大厂面试题第二季周阳主讲整理笔记【涨薪必看】
  18. 中南民大计算机学院复试细则,中南民族大学各学院2019年考研复试细则
  19. 论文投稿指南——中国(中文EI)期刊推荐(第6期)
  20. 【大学生项目与竞赛】2021年全国大学生电子设计大赛 (二)模块储备

热门文章

  1. url、href、src
  2. vue 跨域:使用vue-cli 配置 proxyTable 实现跨域问题
  3. 记录一下git 的常用命令
  4. oracle中创建一个用户,只能查看指定的视图,如何授权,创建别名
  5. 实现拖拽上传文件的一款小控件——dropzone
  6. 4月14日,微软发布例行月度安全更新
  7. 亲身试验 pycharm 下载 并 安装 pygame包
  8. SSM之Mybatis框架初步
  9. 修改ssh端口centos7
  10. 系统管理员最应该读的5本书_系统管理员的8本书