waitformultipleobjects 具有未知数量的句柄

Posted

技术标签:

【中文标题】waitformultipleobjects 具有未知数量的句柄【英文标题】:waitformultipleobjects with unknown number of handles 【发布时间】:2013-01-07 05:09:47 【问题描述】:

这是我需要做的—— 1.定义句柄threadHandle,定义句柄数组h[20]...其中数组中的每一项都有值threadHandle。

    我的代码打开了 20 个线程,一旦完成,每个线程都必须向主线程发出信号,一旦它们都发出信号,主线程必须将某些内容记录到日志文件中。

我打算这样做:

定义threadHandle和上面定义的句柄数组h[20。

代码打开 20 个线程,执行 - waitformultipleobjects(NULL,20,h,true,10000)

现在代码将等待在等待返回之前设置 h 数组中的所有句柄。但是由于 h 的所有值都相同,所以等待函数返回错误。有没有办法解决这个问题?我基本上需要所有线程向调用线程发出信号...为 20 个线程中的每一个定义 20 个处理程序似乎也不是一个好主意。

我可以这样做吗? -

定义threadHandle和句柄数组h[20]。 为向主线程发出信号的线程数维护一个变量计数。

waitforsingleobject(threadHandle)

一旦返回,增加 count 并且如果 count

我正在尝试这个,但想知道是否有更好的方法来做到这一点。

TIA。 和

【问题讨论】:

在多个线程中使用相同的事件是行不通的。您很有可能会错过一些信号事件。相反,使用 Jerry 提到的 20 个独特事件。有一个 EVT_BASE 并将每个事件初始化为 EVT_BASE+1...+20。您还可以改进设计以包装子线程并隐藏初始化 所有值都一样?什么鬼? 【参考方案1】:

创建 20 个事件对象。将他们的句柄放入h。将一个传递给您创建的每个线程。当线程需要向父级发送信号时,它会向该事件发送信号。父级等待事件句柄,当它们都发出信号时,它会写入日志。

【讨论】:

【参考方案2】:

使用一个信号量代替,(参见 CreateSemaphore() API,计数初始化为 0),所有线程都发出信号。循环中的 WaitForSingleObject,最多计数 20。设置更容易,不会错过任何事件,并且适用于任意数量的线程,(在合理范围内)。

【讨论】:

【参考方案3】:

Maintain a variable count for the number of threads。是的,你可以这样做。

nCount The number of object handles in the array pointed to by lpHandles. The maximum number of object handles is MAXIMUM_WAIT_OBJECTS. This parameter cannot be zero.

nCount 不是指定数组大小,而是指定要等待的句柄数。但是,它不得超过数组大小,并且两者都不得超过 MAXIMUM_WAIT_OBJECTS。

提示:这不仅限于线程句柄等特定句柄。您可以通过这种方式处理各种等待句柄的混合。 (MSDN WaitForMultipleObjects function)

But since all the values of h are the same... ,它们不一样,WaitForMultipleObjects 的返回值会相应变化(WAIT_OBJECT_0 + nCount)。

【讨论】:

以上是关于waitformultipleobjects 具有未知数量的句柄的主要内容,如果未能解决你的问题,请参考以下文章

WaitForMultipleObjects与WSAWaitForMultipleEvents

WaitHandle.WaitAny 匹配 WaitForMultipleObjects 功能

在 WaitForMultipleObjects 窗口中等待可变数量的事件

WaitForMultipleObjects的使用问题

WaitForMultipleObjects 到底啥意思,啥作用

MFC线程操作 WaitForMultipleObjects返回值