什么是事件处理?

时间:2010-03-03 22:37:09

标签: winapi handle

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

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

事件内核对象的Junfeng Zhang只链接到通用同步概述...那么什么是事件句柄,它们与互斥锁/信号量/其他什么不同?

2 个答案:

答案 0 :(得分:3)

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

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

编辑:更多信息(来自Windows Internals 5th Edition - 第3章系统机制)

某些内核调度程序对象(例如互斥锁,信号量)具有概念所有权。因此,当发出信号时,释放的一个等待线程将被释放将获取这些资源。其他人将不得不继续等待。事件不归,因此可以由任何线程重置。

还有三种类型的事件:

  • 通知:在发出信号后,所有等待的线程都被释放
  • 同步:在发出信号时,释放一个等待线程,但事件已重置
  • 键入:在发出信号器时,在同一进程中发出一个等待线程的信号。

我学到的另一个有趣的事情是critical sectionsthe lock primitive in c#)实际上不是内核对象,而是根据键控事件或互斥或信号量实现的。

答案 1 :(得分:2)

如果您正在讨论内核Event Objects,那么事件句柄将是系统保留在此对象上的句柄(Int),以便其他对象可以引用它。 IE保持“手柄”。

希望这有帮助!