首页 > 解决方案 > 关闭事件对象会导致等待该对象的线程唤醒吗?

问题描述

假设我有一个 Windows 事件对象,例如来自调用CreateEvent.

线程 A 被阻塞在WaitForSingleObject(event_handle).

线程 B 调用CloseHandle(event_handle).

问题1:线程A会发生什么?

问题 2:如果线程 A 被阻塞,有什么不同WaitForMultipleObjects吗?返回什么WaitForMultipleObjects

标签: windows

解决方案


从实验来看,如果句柄关闭似乎不会WaitForSingleObject唤醒,即线程A一直在等待。我没有检查,但我认为是一样的。WaitForMultipleObjects

我怀疑发生了什么是内核中的事件对象被引用计数。CloseHandle删除一个引用,但它不一定会破坏底层对象。(例如,如果多个进程持有同一个对象的句柄,则在所有进程调用 之前,该对象不会被销毁CloseHandle。)并且WaitForSingleObject还会引用它等待的对象。当然,我没有 Windows 源代码,所以我无法确定这一点。


推荐阅读