使用WaitForMultipleObjects(... /*bWaitAll=*/FALSE ...)
该函数时,显然会修改导致它返回的第一个同步对象的状态。也就是说,如果你有(有)一个带信号的自动重置事件,并且返回值表明这个事件对象导致函数返回,那么它肯定已经被重置了。
但是,请考虑您有多个对象的情况 - 这里:
当
bWaitAll
is时FALSE
,此函数按从索引 0 开始的顺序检查数组中的句柄,直到其中一个对象发出信号。 如果多个对象发出信号,则该函数返回数组中第一个句柄的索引,其对象被发出信号。
所以你只取回了第一个句柄,并且你不知道这个索引之后是否有任何事件已经发出信号。
对于状态被修改的对象,现在的问题是,如果多个对象在 WaitForMultipleObjects 返回时已发出信号,是只修改第一个的状态,还是所有已发出信号的对象都已重置?
文档确实指出:
该函数修改某些类型的同步对象的状态。修改仅针对其信号状态导致函数返回的一个或多个对象。
所以这表明多个对象确实有可能修改它们的状态。然而,这与声明略有矛盾:
...此函数按从索引 0 开始的顺序检查数组中的句柄,直到其中一个对象发出信号。...
此外,这意味着不可能将此功能与多个同步对象(如自动重置事件、信号量等)一起使用,这些对象的状态已被修改,因为您总是会丢失信息。
我在“多个句柄时 WaitForMultipleObjects 的行为......”的答案中找到了一个声明,其他人会得出结论(从那里的评论):
WaitForMultipleObjects() 从 0 开始扫描句柄数组,并在找到信号句柄后立即返回。只有第一个找到的句柄被重置为无信号状态;其他的都没有动。– user82238 / 2009-03-25 19:27
但想重新询问并可能明确确认这一点。
CodeGuru上也有一个有趣的讨论,这似乎并没有说明这一点。