CloseHandle()的作用

BOOL WINAPI CloseHandle(
  _In_ HANDLE hObject
);

作用:
Closes an open object handle.
参数:
hObject [in],A valid handle to an open object.
返回值:
If the function succeeds, the return value is nonzero.
If the function fails, the return value is zero. To get extended error information, call GetLastError.

今天在看书上源码的时候,发现代码中创建了线程之后就随即对句柄调用了CloseHandle(HANDLE)(因为后期不需要对创建的线程进行控制),当时想这才刚创建,把句柄关了之后线程还执行吗?
1. 首先,线程和线程句柄不是一个概念。线程是一个程序的工作流程,而线程句柄是一个内核对象。线程的生命周期就是线程函数从开始执行到线程结束,线程句柄的生命周期从CreateThread()返回到CloseHandle()。
2. 句柄可以看作是一个应用程序变量,系统用它来存储关于应用程序的上下文信息和应用程序所用到的一些对象。系统对内核对象有个引用计数,当引用计数为0时该内核对象就会被删除。而句柄是会使该引用计数+1的,所以当我们不需要利用句柄对线程进行干预时,应当调用CloseHandle关闭句柄使引用计数-1。这也是个应该养成的好习惯,可以避免句柄泄露和句柄耗尽。(句柄泄露不同于内存泄漏)
3. 线程创建后,内核对象的引用计数也是会+1的,返回的句柄也是在内核对象的引用计数上+1的,所以CloseHandle后内核对象还不会被删除,更加不会对线程的运行造成影响。
4. 那么保留线程句柄有什么作用?当我们需要干预或者操作线程时,例如改变优先级,被其他线程等待,强制TermateThread,waitforsingleobject等。(ps:对于线程来讲,如果线程在运行状态则为无信号状态,在退出后为有信号状态。所以我们可以使用 WaitForSingleObject 来等待线程退出)。
5. 如果没有调用CloseHandle会造成什么影响?若在线程执行完之后,没有调用CloseHandle,在进程执行期间,将会造成内核对象的泄露,相当于句柄泄露,但不同于内存泄露,这势必会对系统的效率带来一定程度上的负面影响。但当进程结束退出后,系统会自动清理这些资源。

参考的博文(感谢博主分享):
http://www.cnblogs.com/cryinstall/archive/2011/08/06/2280830.html
http://www.cnblogs.com/candycaicai/archive/2011/02/23/1962554.html

你可能感兴趣的:(C++)