当多个句柄同时发出信号时,WaitForMultipleObjects
函数的行为取决于它的参数设置。在这种情况下,该函数将等待任何一个对象变为已终止状态,并返回已终止对象的索引。这种方式被称为“随机赢者”模式。
以下是 WaitForMultipleObjects
函数的一个示例:
#include<windows.h>
#include<stdio.h>
int main()
{
HANDLE hMutex1 = CreateMutex(NULL, FALSE, TEXT("Mutex1"));
HANDLE hMutex2 = CreateMutex(NULL, FALSE, TEXT("Mutex2"));
HANDLE hMutex3 = CreateMutex(NULL, FALSE, TEXT("Mutex3"));
// 等待多个对象,直到其中一个变为已终止状态
DWORD dwWaitResult = WaitForMultipleObjects(3,
hMutexArray, FALSE, INFINITE);
switch (dwWaitResult)
{
case WAIT_OBJECT_0:
// hMutex1已终止
break;
case WAIT_OBJECT_0 + 1:
// hMutex2已终止
break;
case WAIT_OBJECT_0 + 2:
// hMutex3已终止
break;
default:
printf("WaitForMultipleObjects 失败。\n");
break;
}
// 关闭句柄
CloseHandle(hMutex1);
CloseHandle(hMutex2);
CloseHandle(hMutex3);
return 0;
}
在这个示例中,我们创建了三个互斥量,并使用 WaitForMultipleObjects
函数等待它们。当其中一个互斥量变为已终止状态时,函数将返回该互斥量的索引。
需要注意的是,WaitForMultipleObjects
函数的参数设置决定了它的行为。例如,如果将 bWaitAll
参数设置为 TRUE
,则该函数将等待所有对象变为已终止状态,并返回 WAIT_OBJECT_0
到 WAIT_OBJECT_0 + nCount - 1
之间的值之一。如果将 dwMilliseconds
参数设置为一个非零值,则该函数将等待指定的毫秒数,如果超时则返回 WAIT_TIMEOUT
。
领取专属 10元无门槛券
手把手带您无忧上云