WaitForMultipleObjects使用详解

当WaitForMultipleObjects()等到多个内核对象的时候,

如果它的bWaitAll 参数设置为false。其返回值减去WAIT_OBJECT_0 就是参数lpHandles数组的序号。

如果同时有多个内核对象被出发,这个函数返回的只是其中序号最小的那个。

问题就在这里,我们如何可以获取所有被同时触发的内核对象。

举个例子:我们需要在一个线程中处理从完成端口、数据库、和可等待定时器来的数据。

一个典型的实现方法就是:用WaitForMultipleObjects等待所有的这些事件。

如果完成端口,数据库发过来的数据量非常大,可等待定时器时间也只有几十毫秒。

那么这些事件同时触发的几率可以说非常大,我们不希望丢弃任何一个被触发的事件。那么如何能高效地实现这一处理呢?

 

多个内核对象被触发时,WaitForMultipleObjects选择其中序号最小的返回。而WaitForMultipleObjects它只会改变使它返回的那个内核对象的状态。
这儿又会产生一个问题,如果序号最小的那个对象频繁被触发,那么序号比它大的内核对象将的不到被出理的机会。
 为了解决这一问题,可以采用双WaitForMultipleObjects检测机制来实现。见下面的例子:

 

  • 4
    点赞
  • 83
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
`WaitForMultipleObjects` 函数可以用于等待多个对象(如线程、事件、互斥体等)中的任意一个对象被信号激发。该函数会阻塞当前线程直到有一个对象被激发或者超时。 以下是一个使用 `WaitForMultipleObjects` 函数等待多个线程执行完毕的示例代码: ```c #include <windows.h> #include <stdio.h> #define THREAD_COUNT 3 DWORD WINAPI thread_func(LPVOID lpParam) { int id = (int)lpParam; printf("Thread %d started\n", id); // 模拟耗时操作 for (int i = 0; i < 1000000000; i++); printf("Thread %d finished\n", id); return 0; } int main() { HANDLE hThreads[THREAD_COUNT]; for (int i = 0; i < THREAD_COUNT; i++) { hThreads[i] = CreateThread(NULL, 0, thread_func, (LPVOID)i, 0, NULL); if (hThreads[i] == NULL) { printf("Failed to create thread %d\n", i); return 1; } } DWORD waitResult = WaitForMultipleObjects(THREAD_COUNT, hThreads, TRUE, INFINITE); if (waitResult == WAIT_FAILED) { printf("WaitForMultipleObjects failed\n"); return 1; } printf("All threads finished\n"); for (int i = 0; i < THREAD_COUNT; i++) { CloseHandle(hThreads[i]); } return 0; } ``` 这段代码创建了 3 个线程,并使用 `WaitForMultipleObjects` 函数等待所有线程执行完毕。其中第一个参数是对象个数,第二个参数是对象数组,第三个参数指定是否等待所有对象都被激发,第四个参数指定超时时间。在本例中,第三个参数为 `TRUE` 表示等待所有对象都被激发。当等待函数返回时,可以判断返回值以确定哪个对象被激发。需要注意的是,等待函数返回时需要关闭对象句柄,否则可能会导致内存泄漏。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值