当前位置:  开发笔记 > 编程语言 > 正文

当多个句柄同时发出信号时,WaitForMultipleObjects的行为

如何解决《当多个句柄同时发出信号时,WaitForMultipleObjects的行为》经验,为你挑选了2个好方法。

给定:我用自动重置事件填充一个句柄数组,并将其传递给具有bWaitAll = FALSE的WaitForMultipleObjects.

从MSDN:"当bWaitAll为FALSE时,此函数按顺序检查数组中的句柄,从索引0开始,直到其中一个对象发出信号.如果多个对象变为信号,则该函数返回其对象被发信号通知的数组中第一个句柄的索引."

所以,现在如果多个对象发出信号,我将获得第一个的索引.我是否必须通过我的阵列循环以查看是否有其他人发出信号?

现在我有一个循环:

For ( ; ; )
{
WaitForMultipleObjects(…)
If  (not failed)
     Process object that called. 
     Remove the handle that signaled from the array.
     Compact the arrary.
}

Michael.. 5

是.另一种方法是你可以在每个句柄上做WaitForSingleObject(句柄,0),它会立即返回并指示它们是否有信号.

编辑:这是我的意思的样本伪代码:

ret = WaitForMultipleObjects()
if (ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + (count))
{
    firstSignaled = ret - WAIT_OBJECT_0;

    // handles[firstSignaled] guaranteed signalled!!

    for (i = firstSignaled + 1; i < count; i++)
    {
        if (WaitForSingleObject(handles[i], 0) == WAIT_OBJECT_0)
        {
           // handles[i] Signaled!
        }
    }
}

超时为0表示WaitForSingleObject不等待.它检查发信号状态并立即返回WAIT_OBJECT_0或WAIT_TIMEOUT.还是我误解了你的陈述? (2认同)


小智.. 5

所以,现在如果多个对象发出信号,我将获得第一个的索引.我是否必须通过我的阵列循环以查看是否有其他人发出信号?

为什么不回到Wait()?如果多个物体发出信号,当你回来时它们仍然会发出信号.当然,如果你在wait对象数组中有一个非常快速地触发第一个对象,它会使其他对象饿死; 你所做的是按照射击频率在等待对象数组中命令你的对象,最少的是先发生.

顺便说一下,你在使用无穷的for(),你可以使用goto.如果你真的没有离开循环,无条件goto最恰当地表达你的意图.



1> Michael..:

是.另一种方法是你可以在每个句柄上做WaitForSingleObject(句柄,0),它会立即返回并指示它们是否有信号.

编辑:这是我的意思的样本伪代码:

ret = WaitForMultipleObjects()
if (ret >= WAIT_OBJECT_0 && ret < WAIT_OBJECT_0 + (count))
{
    firstSignaled = ret - WAIT_OBJECT_0;

    // handles[firstSignaled] guaranteed signalled!!

    for (i = firstSignaled + 1; i < count; i++)
    {
        if (WaitForSingleObject(handles[i], 0) == WAIT_OBJECT_0)
        {
           // handles[i] Signaled!
        }
    }
}


超时为0表示WaitForSingleObject不等待.它检查发信号状态并立即返回WAIT_OBJECT_0或WAIT_TIMEOUT.还是我误解了你的陈述?

2> 小智..:

所以,现在如果多个对象发出信号,我将获得第一个的索引.我是否必须通过我的阵列循环以查看是否有其他人发出信号?

为什么不回到Wait()?如果多个物体发出信号,当你回来时它们仍然会发出信号.当然,如果你在wait对象数组中有一个非常快速地触发第一个对象,它会使其他对象饿死; 你所做的是按照射击频率在等待对象数组中命令你的对象,最少的是先发生.

顺便说一下,你在使用无穷的for(),你可以使用goto.如果你真的没有离开循环,无条件goto最恰当地表达你的意图.

推荐阅读
周扒pi
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有