【问题标题】:Does WaitForMultipleObjects() reset all auto-reset events?WaitForMultipleObjects() 是否会重置所有自动重置事件?
【发布时间】:2012-03-19 19:00:10
【问题描述】:

我有一个正在等待几个自动重置事件的事件循环。 事件全部初始化为数组eventHandles_CreateEvent(NULL, false, false, NULL)

while (true)
{
    DWORD waitResult = WaitForMultipleObjects(3, eventHandles_, false, INFINITE);
    switch (waitResult)
    {
    case WAIT_OBJECT_0 + 0:
        //handle event...

    case WAIT_OBJECT_0 + 1:
        //handle event...

    case WAIT_OBJECT_0 + 2:
        //handle event...
    }
}

我的问题:如果事件 1 和 2 同时发生,循环将处理 WAIT_OBJECT_0 + 1,因为它是第一个。但是当循环再次出现时,事件 2 是否会保持信号状态?还是会自动重置?

【问题讨论】:

  • 一般来说,最好尽量避免这样的结构。我会让每个信号线程将一个合适的索引、委托或其他任何东西推送到一个线程安全的队列中并发出一个信号量。这种设计围绕着这个问题 - 行为是完全已知和可预测的,即使一个线程多次发出信号,也不会丢失任何事件,没有 64 个句柄限制,并且信号头的数量在编译时不固定。

标签: windows multithreading winapi events asynchronous


【解决方案1】:

"...修改只发生在其信号状态导致函数返回的一个或多个对象上..."

http://msdn.microsoft.com/en-us/library/windows/desktop/ms687025(v=vs.85).aspx

从一个Raymond Chen的口中:

如果等待一个事件,则仅修改该事件。如果等待 对于所有事件,然后全部被修改。这就是文档的内容 指“一个或多个物体”。单数 if wait-any,复数 if 等等。

【讨论】:

    猜你喜欢
    • 2011-07-03
    • 1970-01-01
    • 1970-01-01
    • 2010-12-24
    • 2015-02-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-26
    相关资源
    最近更新 更多