句柄泄露与CloseHandle

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Win32FanEx/article/details/78824616

参考:http://www.cnblogs.com/zhwl/archive/2012/11/07/2758212.html

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

......
ThreadHandle = CreateThread(NULL,0,.....);
CloseHandel(ThreadHandle );
......
这不是刚好创建又关闭了吗?线程怎么运行呢?
因为这里只是"关闭"线程句柄,并不是关闭线程。准确说CloseHandel只是降低了句柄的引用计数。句柄是进程内系统空间和用户空间交互的纽带。当用户申请创建、引用一个Windows资源时(比如窗体、线程、其它内核对象等),Windows会提供一个句柄给用户,并将该句柄引用计数加1 。用户可以通过该句柄访问和使用Windows系统资源。使用完毕后应CloseHandel降低引用计数,通知系统我不用这个资源了。系统会在引用计数为0时回收句柄(用户就无法再通过该句柄使用资源了,就是说这个句柄将会失效,至于句柄原先所指的资源系统如何处理,就不需要用户操心了)

所以,如果你CreateThread以后需要对这个线程做一些操作,比如改变优先级,被其他线程等待,强制TermateThread等,就要保存这个句柄,使用完了在CloseHandle。如果你开了一个线程,而不需要对它进行如何干预,CreateThread后直接CloseHandle就行了。

如果不及时closehandle,一是会造成句柄的浪费,更重要的是在某些场合会造成程序运行错误,比如我使用事件内核同步对象:

CreateEvent
OpenEvent

目的是对两个进程进行同步,如果其中一个进程被关闭,那么两个进程间的交互也就失去意义。但如果没有CloseHandel,那么OpenEvent将永远成功,这必然会造成程序逻辑上的错误。

猜你喜欢

转载自blog.csdn.net/Win32FanEx/article/details/78824616