为什么关闭了线程句柄,线程仍可以运行

主线程只要拥有线程句柄,事后就可以对线程执行某些操作,比如查询线程状态等等,靠的就是句柄,如果没有句柄,系统就无从知道要查的是那个线程的状态。但保持这个句柄不关闭,并不是线程运行的必要条件。

关闭线程句柄只是释放句柄资源,新开启线程后,如果不再利用其句柄,应该关闭句柄,释放系统资源。关闭线程句柄和线程的结束与否没有关系。

句柄可以认为是系统对资源(如线程)的分配的一个编号。关闭这个编号,对于不同的资源,效果不尽相同。对于线程来说,关闭这个编号并不意味着终止线程,只是之后很难再操纵这个线程。   这就好比摘掉了门牌号,并不伤害这一家人,只是以后往这送信就麻烦些了。   还有,如果主线程只想创建线程,而并不想之后再查询或操纵它,那么及时关闭句柄是个好习惯,免得当时没关,以后又忘了,于是泄漏了系统的句柄资源(系统句柄总数是有限的)。

如果知道引用计数是怎么回事就很好解释了。   CloseHandle(hThread)   只是减去一个hThread的引用计数。

线程句柄就像你家的地址,线程就像你的家房子,   你说如果没有了你家的地址,难道就没有你家的房子了吗?  线程与线程句柄也是一样的道理,句柄只是可以对这个线程作一些操作。

CloseHandle是关闭线程句柄,用来释放线程资源的,不是终止线程的.线程的终止用terminatethread或exitthread,TerminateThread的使用会导致各类资源释放问题,主要是与该线程相连的各类dll,他们无法得到线程退出的通知。应该在线程中自然退出(即隐式调用ExitThread)或直接显式调用ExitThread。退出的时机应由同步对象或其他机制来实现,而且主线程一般应使用WaitForSingleObject函数等待该线程的句柄,以确保线程的退出。

时间: 2024-10-20 23:42:25

为什么关闭了线程句柄,线程仍可以运行的相关文章

线程句柄有什么用

非托管资 源:ApplicationContext,Brush,Component,ComponentDesigner,Container,Context,Cursor,FileStream,Font,Icon,Image,Matrix,Object,OdbcDataReader,OleDBDataReader,Pen,Regex,Socket,StreamWriter,Timer,Tooltip 以下转帖:http://www.cnblogs.com/candycaicai/archive/2

获取真正的进程/线程句柄

首先在开始正文之前先介绍最简单的获取进程/线程句柄方法.那就是可以在创建进程/线程时获取句柄. 创建进程/线程是获取句柄. //进程创建函数 BOOL CreateProcess( PCTSTR pszApplicationName, PTSTR pszCommandLine, PSECURITY_ATTRIBUTES psaProcess, PSECURITY_ATTRIBUTES psaThread, BOOL bInheritHandles, DWORD fdwCreate, PVOID

C#中的线程(二) 线程同步基础

1.同步要领 下面的表格列展了.NET对协调或同步线程动作的可用的工具:                       简易阻止方法 构成 目的 Sleep 阻止给定的时间周期 Join 等待另一个线程完成                       锁系统 构成 目的 跨进程? 速度 lock 确保只有一个线程访问某个资源或某段代码. 否 快 Mutex 确保只有一个线程访问某个资源或某段代码.可被用于防止一个程序的多个实例同时运行. 是 中等 Semaphore 确保不超过指定数目的线程访问某

MFC【17-1】线程和线程同步化

17.1线程 对于Windows来说所有的线程都是一样的,但MFC却把线程区分为两种类型:User Interface(UI) threads(用户界面(UI)线程)和Worker threads(工作者线程). 两种线程的不同之处在于UI线程具有消息循环而工作者线程没有.UI线程可以创建窗口并处理发送给这些窗口的消息.工作者线程执行后台任务. 17.1.1创建工作者线程 AfxBeginThread定义了两个版本:一个启动UI线程,另一个启动过作者线程 CWinThread*pThread=A

C#线程 使用线程

第三部分 使用线程 基于事件的异步模式 基于事件的异步模式(EAP)提供了一种简单的方法,通过这些方法,类可以提供多线程功能,而使用者无需显式启动或管理线程.它还提供以下功能: 合作取消模型 工作人员完成时可以安全更新WPF或Windows Forms控件的功能 将异常转发到完成事件 EAP只是一种模式,因此这些功能必须由实现者编写.框架中只有少数几个类遵循此模式,最著名的是BackgroundWorker(我们将在后面介绍)以及System.Net中的WebClient.本质上,模式是这样的:

MFC【17-3】线程和线程同步化

17.3小知识点 17.3.1消息泵 编写一个应用程序,让它响应某菜单命令,画几千个椭圆. 1 void CMFC线程View::OnStartDrawing(void) 2 { 3 m_bQuit=FALSE; 4 for(int i=0;i<NUMELLIPSES&&!m_bQuit;i++) 5 { 6 DrawRandomEllipse(); 7 if(!PeekAndPump()) 8 break; 9 } 10 } 11 12 13 void CMFC线程View::On

菜鸟之旅——学习线程(线程和线程池)

愉悦的绅士 菜鸟之旅--学习线程(线程和线程池) 上一篇主要介绍了进程和线程的一些基本知识,现在回归正题,我们来学一下线程的使用,本篇主要是使用新建线程和线程池的方式. 线程 先来介绍简单的线程使用:使用new方法来创建线程,至于撤销线程,我们不必去管(我也不知道怎么去管XD),因为CLR已经替我们去管理了. 创建 先来看一个简单的使用线程的例子: static void Main(string[] args) { Thread t1 = new Thread(Menthod1); Thread

利用NtQuerySystemInformation函数遍历进程,遍历线程,获取线程挂起或运行状态

版权声明:专注于计算机网络安全学习 https://blog.csdn.net/u011672712/article/details/51586030 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61

线程和线程池

首先线程有守护线程和用户线程两种,区别就是用户线程是否保持程序的运行状态.当程序在运行时,必定有一个或以上的线程是用户线程,而当程序结束时,所有守护线程也都将被关闭.使用Thread.setDaemon(ture)可以把线程标记为守护线程,默认线程状态继承自创建它的线程.线程的两种创建方法不多说了. 线程安全一般指的是共享变量被多个线程访问读写造成的数据不一致或者是数据不完整性.一般有如下几种方法可供参考: 1.synchronized方法,提供只能供一个线程访问的类,方法或语句块,控制变量的修