2010-03-03 61 views
2

在一些继承的C#winforms代码中,我有一个泄漏的句柄问题(“没有足够的配额可用于处理此命令”),所以我去了并使用Sysinternals的Handle工具来追踪它。事实证明,这是事件处理程序泄漏,所以我试图用Google搜索它(花了几个尝试找到一个query,没有返回“你的意思是:事件处理程序?”)。根据Junfeng Zhang,通过使用Monitor生成事件句柄,并且就事件句柄处理和同步原语而言,可能存在一些奇怪的规则。什么是事件句柄?

我不完全确定,我的泄漏句柄的来源完全是由于长寿命的对象调用大量同步的东西,因为此代码也处理HID接口和大量的win32编组和互操作,以及没有做任何我知道的同步。无论哪种方式,我只是要在windbg中运行这个函数,并开始追踪句柄的来源,并花费大量时间学习代码的这一部分,但我很难找到关于什么事件的信息手柄是第一位的。

事件内核对象的msdn page只是链接到通用同步概述......那么,什么是事件句柄,它们与互斥/信号/不管怎么样?

回答

3

NT内核使用事件对象来允许信号传输到等待信号的实体。互斥体和信号量也是可等待的内核对象(内核调度程序对象),但具有不同的语义。我唯一遇到过他们的时候是在等待IO完成司机。

所以我对你的问题的理论可能是一个错误的驱动程序,或者你依靠专门的硬件?

编辑:更多信息(从Windows Internals 5th Edition - 第3章系统力学)

一些内核同步对象(如互斥,信号量)有概念的所有权。因此,当发出释放的一个等待线程将被释放将抓住这些资源。其他人将不得不继续等待。事件不是拥有的,因此可以由任何线程重置。

也有三种类型的事件:

  • 通知:在以信号所有等待的线程被释放
  • 同步:在暗示一个等待的线程被释放,但该事件是重置
  • 键位:开信号发出一个等待线程在发信号器的同一过程中。

,我已经学会了另一个有趣的事情是,critical sectionsthe lock primitive in c#)实际上不是内核对象,而他们实现了一个键的事件,或互斥或信号的要求。

+0

啊,所以他们几乎是相同的,只是与硬件驱动程序而不是软件一起使用的不同实现/语义。谢谢! – Tanzelax 2010-03-03 22:50:57

+0

是的,这个继承的代码组件本质上是设备驱动程序(它直接调用hid.dll并返回设备的输入/输出包装),所以我相当确定问题出在这里,而不是任何硬件特质。 – Tanzelax 2010-03-03 23:08:19

+0

@Preet:很酷...我希望我能再次为你回复这个答案,这真的很高兴知道。如果你想知道,这个问题最终只会导致你每天不处理正确的泄漏,但是我从中学到了很多东西。 :) – Tanzelax 2010-03-07 05:10:09

2

如果你在谈论内核Event Objects,那么一个事件句柄将是一个句柄(Int),系统保存在这个对象上,以便其他对象可以引用它。 IE保持一个“处理”。

希望这会有所帮助!

+0

这肯定有点帮助,虽然我还没有真正清楚事件对象同步与信号量的不同(即:为什么有一个单独的内核对象?) – Tanzelax 2010-03-03 22:47:29