假设我有一个Windows事件对象,例如致电CreateEvent
。
线程A在WaitForSingleObject(event_handle)
中被阻止。
线程B调用CloseHandle(event_handle)
。
问题1:线程A会发生什么?
问题2:如果线程A在WaitForMultipleObjects
中被阻塞,这会有所不同吗? WaitForMultipleObjects
返回什么?
答案 0 :(得分:1)
根据实验,如果关闭了句柄,则WaitForSingleObject
不会不唤醒,即线程A一直在等待。我没有检查,但是我假设WaitForMultipleObjects
是相同的。
我怀疑这是内核内部的事件对象被引用计数了。 CloseHandle
删除了引用,但不一定会破坏基础对象。 (例如,如果多个进程持有同一对象的句柄,则直到所有进程都调用CloseHandle
时,该对象才会被销毁。)WaitForSingleObject
还引用了它等待的对象。当然,我没有Windows源代码,因此无法确定。