使用时WaitForMultipleObjects(... /*bWaitAll=*/FALSE ...) http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025%28v=vs.85%29.aspx该函数显然会修改导致其返回的第一个同步对象的状态。也就是说,如果您有信号自动重置event http://msdn.microsoft.com/en-us/library/windows/desktop/ms682396%28v=vs.85%29.aspx,返回值表明this事件对象导致函数返回,这肯定已经被重置。
但是,请考虑您有的情况multiple对象 - 此处:
When bWaitAll
is FALSE
,该函数检查数组中的句柄
从索引 0 开始,直到其中一个对象收到信号为止。如果多个对象发出信号,该函数将返回对象的索引
第一个句柄在其对象被发出信号的数组中。
因此,您只能返回第一个句柄,并且不知道该索引之后是否有任何事件已发出信号。
对于状态被修改的对象,现在的问题是,如果在 WaitForMultipleObjects 返回时已发出多个对象的信号,则仅修改第一个对象的状态,或者所有有信号的对象都会被重置吗?
文档确实指出:
该函数修改某些类型同步的状态
对象。修改仅针对对象发生或物体谁的
有信号状态导致函数返回。
因此这表明多个对象确实可以修改其状态。然而,这slightly与以下说法相矛盾:
...该函数检查数组中的句柄
从索引 0 开始,直到其中一个对象收到信号为止。 ...
此外,这意味着不可能将此函数与状态已修改的多个同步对象(例如自动重置事件、信号量等)一起使用,因为您总是会丢失信息。
我找到了一个声明这是“多个句柄时 WaitForMultipleObjects 的行为...”的答案 https://stackoverflow.com/a/680392/321013其他人会得出这样的结论(根据那里的评论):
WaitForMultipleObjects() 从 0 开始扫描句柄数组并
一旦找到有信号的句柄就返回。仅限第一个发现的
句柄重置为无信号状态;其他的则未受影响。 –
用户82238 / 2009 年 3 月 25 日 19:27
但想重新询问并可能明确确认这一点。
还有一个CodeGuru 上的有趣讨论 http://forums.codeguru.com/showthread.php?499419-How-can-I-get-all-the-signaled-events-after-WaitForMultipleObjects%28%29-returned,这似乎并没有说明这一点。