WaitForMultipleObjects会修改* multiple *对象的状态吗?

时间:2014-04-02 14:20:28

标签: c++ winapi visual-c++ waitformultipleobjects

使用WaitForMultipleObjects(... /*bWaitAll=*/FALSE ...)时,该函数显然会修改导致它返回的第一个同步对象的状态。也就是说,如果你有一个信号自动重置event,并且返回值表明这个事件对象导致函数返回,那肯定它已被重置。< / p>

但是,请考虑您有多个对象的情况 - 此处:

  

bWaitAllFALSE时,此函数会检查数组中的句柄   按顺序从索引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,似乎没有对此有所了解。

1 个答案:

答案 0 :(得分:2)

好。 Waddayaknow。

来自Raymond Chen的评论:

  

如果等待一个事件,则仅修改该事件。如果   等待所有事件,然后所有事件都被修改。这是什么的   文档意味着&#34;对象或对象&#34;。单数如果等待任何,   复数,如果等待。 - Raymond Chen

这将与包含&#34;对象或对象&#34; 的段落之前的文档相匹配,在同一个Remarks子标题下,我们{{3} }:

  

当bWaitAll为TRUE时,函数的等待操作仅完成   当所有对象的状态都已设置为发信号时。 功能   在状态之前不会修改指定对象的状态   所有对象的设置已发出信号。

所以回答这个问题,如下:如果bWaitAll==FALSE那么第一个对象(报告的那个是返回的索引)的状态发生了变化。