句柄泄露与CloseHandle

参考: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将永远成功,这必然会造成程序逻辑上的错误。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值