windows多线程系列006 WaitForMultipleObjects详解

    有时我们会用到WaitForMultipleObjects()这个函数,在这里我们简单了解一下该函数的使用,先看函数原型:
DWORD
WINAPI
WaitForMultipleObjects(
_In_ DWORD nCount,
_In_reads_(nCount) CONST HANDLE *lpHandles,
_In_ BOOL bWaitAll,
_In_ DWORD dwMilliseconds
);
nCount 句柄的数量 最大值为MAXIMUM_WAIT_OBJECTS(64)
HANDLE 句柄数组的指针。HANDLE 类型可以为(Event,Mutex,Process,Thread,Semaphore )数组
BOOL bWaitAll 等待的类型,如果为TRUE 则等待所有信号量有效再往下执行,FALSE 当有其中一个信号量有效时就向下执行
DWORD dwMilliseconds 超时时间 超时后向执行。 如果为WSA_INFINITE 永不超时。如果没有信号量就会在这死等。
函数功能:
WaitForMultipleObjects函数用于等待多个内核对象,前两个参数分别为要等待的内核对象的个数和句柄数组指针。如果将第三个参数bWaitAll的值设为TRUE,
等待的内核对象全部变成受信状态以后此函数才返回。否则,bWaitAll为0的话,只要等待的内核对象中有一个变成了受信状态,WaitForMultipleObjects就返回,
返回值指明了是哪一个内核对象变成了受信状态。当 bWaitAll参数为FALSE 可以等待其中之一的事件。

举例:

#include <iostream>   
#include <Windows.h>   
using namespace std;

int main()
{
	//创建3个Event对象   
	HANDLE hEvent1 = CreateEvent(NULL, // 安全属性   
		FALSE,  // 是否手动重置对象,为TRUE时等待事件后需手动重置,否则一直处于激发状态   
		NULL,   // 是否初始化为激发状态   
		NULL    // 名称   
		);
	HANDLE hEvent2 = CreateEvent(NULL, TRUE, NULL, NULL);
	HANDLE hEvent3 = CreateEvent(NULL, FALSE, NULL, NULL);

	HANDLE hObject[3];
	hObject[0] = hEvent1;
	hObject[1] = hEvent2;
	hObject[2] = hEvent3;

	/// 激活所有对象   
	SetEvent(hEvent1);
	SetEvent(hEvent2);
	SetEvent(hEvent3);

	/// 等待HANDLE数组中的所有对象,只有所有对象都被激活时才会返回   
	DWORD dwResult = WaitForMultipleObjects(3, hObject, TRUE, INFINITE);
	switch (dwResult)
	{
	case WAIT_OBJECT_0:
		cout << "所有对象都被激活" << endl;
		break;
	case WAIT_FAILED:
		cout << "等待失败" << endl;
		break;
	default:
		break;
	}

	/// 等待成功时,自动重置Event对象会重置Event状态,手动重置则不会,如此时hEvent1、hEvent3已被重置为未激发状态,hEvent2仍处于激发状态   
	/// 此时hEvent2已被重置,再次激活   
	SetEvent(hEvent3);

	/// 等待多个对象中的某一个时,是按数组由前到后遍历,因此Event2、Event3均被激活的情况下,等待到的事件为Event2   
	dwResult = WaitForMultipleObjects(3, hObject, FALSE, INFINITE);
	switch (dwResult)
	{
	case WAIT_OBJECT_0:
		cout << "hEvent1被激活" << endl;
		break;
	case WAIT_OBJECT_0 + 1:
		cout << "hEvent2被激活" << endl;
		break;
	case WAIT_OBJECT_0 + 2:
		cout << "hEvent3被激活" << endl;
		break;
	case WAIT_FAILED:
		cout << "等待失败" << endl;
		break;
	default:
		break;
	}

	/// 手动重置Event对象   
	ResetEvent(hEvent2);

	/// 再次等待,Event2处于未激发状态,等待到的事件为Event3   
	dwResult = WaitForMultipleObjects(3, hObject, FALSE, INFINITE);
	switch (dwResult)
	{
	case WAIT_OBJECT_0:
		cout << "hEvent1被激活" << endl;
		break;
	case WAIT_OBJECT_0 + 1:
		cout << "hEvent2被激活" << endl;
		break;
	case WAIT_OBJECT_0 + 2:
		cout << "hEvent3被激活" << endl;
		break;
	case WAIT_FAILED:
		cout << "等待失败" << endl;
		break;
	default:
		break;
	}

	/// 释放内核对象   
	CloseHandle(hEvent1);
	CloseHandle(hEvent2);
	CloseHandle(hEvent3);

	system("pause");
	return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

余莫星辰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值