使用WaitForMultipleObjects(... /*bWaitAll=*/FALSE ...)
时,该函数显然会修改导致它返回的第一个同步对象的状态。也就是说,如果你有一个信号自动重置event,并且返回值表明这个事件对象导致函数返回,那肯定它已被重置。< / p>
但是,请考虑您有多个对象的情况 - 此处:
当
bWaitAll
为FALSE
时,此函数会检查数组中的句柄 按顺序从索引0开始,直到其中一个对象发出信号。 如果多个对象发出信号,则该函数返回索引 数组中第一个句柄,其对象已发出信号。
因此,您只返回第一个句柄,并且您不知道此索引之后是否有任何事件已发出信号。
对于状态被修改的对象,现在的问题是,如果在WaitForMultipleObjects返回时已经发出多个对象的信号,则只修改第一个的状态,或者所有信号对象都是已被重置?
文档说明:
该函数修改某些类型的同步的状态 对象。修改仅针对对象或对象 发生 信号状态导致函数返回。
所以这表明多个对象确实可以修改其状态。但是,这个略微与声明相矛盾:
...此函数检查数组中的句柄 按顺序从索引0开始,直到其中一个对象发出信号。 ...
此外,这意味着不可能将此函数用于修改状态的多个同步对象(如自动重置事件,信号量等),因为您总是会丢失信息。
我在this answer to "Behavior of WaitForMultipleObjects when multiple handles..."中发现了一条声明,其他人会得出结论(来自那里的评论):
WaitForMultipleObjects()从0开始扫描句柄数组 一找到信号手柄就会立即返回。只有第一次发现 句柄重置为无信号状态;其他的都没有动过。 - user82238 / 09年3月25日19:27
但是想重新询问并明确地证实这一点。
还有一个interesting discussion over at CodeGuru,似乎没有对此有所了解。
答案 0 :(得分:2)
好。 Waddayaknow。
来自Raymond Chen的评论:
如果等待一个事件,则仅修改该事件。如果 等待所有事件,然后所有事件都被修改。这是什么的 文档意味着&#34;对象或对象&#34;。单数如果等待任何, 复数,如果等待。 - Raymond Chen
这将与包含&#34;对象或对象&#34; 的段落之前的文档相匹配,在同一个Remarks
子标题下,我们{{3} }:
当bWaitAll为TRUE时,函数的等待操作仅完成 当所有对象的状态都已设置为发信号时。 功能 在状态之前不会修改指定对象的状态 所有对象的设置已发出信号。
所以回答这个问题,如下:如果bWaitAll==FALSE
那么只第一个对象(报告的那个是返回的索引)的状态发生了变化。