WaitForSingleObject等待函数

1.简介

等待函数使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。如果线程在调用一个等待函数的时候,相应的内核对象已经处于触发状态,那么线程是不会进入等待状态的。最常用是WaitForSingleObject。

DWORD WaitForSingleObject(
  [in] HANDLE hHandle,
  [in] DWORD  dwMilliseconds
);

参数1:用来标识要等待的内核对象,这个内核对象可以处于触发状态或未触发状态。

参数2:用来指定线程最多愿意花多长的时间来等待对象被触发(超时时间,单位为毫秒)

  • 如果指定了一个非0值,则该函数将等待,直到该对象被触发或时间间隔过去。
  • 如果为0,如果对象没有触发,函数不会进入等待状态,它总是立即返回。
  • 如果是INFINITE,如果对象永远不被触发,那么调用线程就永远不会被唤醒,一直阻塞。

2.一个简单的例子


    DWORD dw = WaitForSingleObject(hProcess, 5000);
    switch (dw)
    {
    case WAIT_OBJECT_0:
        break;
    case WAIT_TIMEOUT:
        break;
    case WAIT_FAILED:
        break;
    default:
        break;
    }

上述代码告诉系统,除非指定的进程已经被终止,或者等待时间满5000毫秒,否则不能对调用线程进行调用。

  • 返回WAIT_OBJECT_0:表示线程等待的对象被触发。
  • 返回WAIT_TIMEOUT:表示等待超时。
  • 返回WAIT_FAILED:表示传入了一个无效的句柄。

3.WaitForMultipleObjects

WaitForMultipleObjects与WaitForSingleObject相似,唯一的不同之处在于它允许调用线程同时检查多个内核对象的触发状态。函数如下:

DWORD WaitForMultipleObjects(
  [in] DWORD        nCount,
  [in] const HANDLE *lpHandles,
  [in] BOOL         bWaitAll,
  [in] DWORD        dwMilliseconds
);
  • 参数1:lpHandles指向的数组中的对象句柄数。对象句柄的最大数目是MAXIMUM_WAIT_OBJECTS。该参数不能为0。
  • 参数2:内核对象句柄数组。
  • 参数3:如果该参数为TRUE,当lpHandles数组中所有对象被触发时,该函数返回。如果为FALSE,则当任何一个对象被触发时,该函数返回。返回值为WAIT_OBJECT_0 和 (WAIT_OBJECT_0 + nCount– 1)中的一个。
  • 参数4:等待的时间。

示例:

    HANDLE h[3];
    h[0] = hProcess1;
    h[1] = hProcess2;
    h[2] = hProcess3;

    DWORD dw = WaitForMultipleObjects(3, h, FALSE, 5000);
    switch (dw)
    {
    case WAIT_OBJECT_0 + 0:
        break;
    case WAIT_OBJECT_0 + 1:
        break;
    case WAIT_OBJECT_0 + 2:
        break;
    case WAIT_TIMEOUT:
        break;
    case WAIT_FAILED:
        break;
    default:
        break;
    }

4.等待成功所引起的副作用

成功调用WaitForSingleObject或WaitForMultipleObjects事实上会改变对象的状态。一个成功的调用指的是函数发现已经被触发了,然后返回WAIT_OBJECT_0 ,如果不成功,则返回超时或者错误。这种情况下对象的状态是不会发生改变的。

如果对象的状态发生了改变,称为等待成功所引起的副作用。

举例:假设线程正在等待一个自动重置事件对象,当事件对象被触发时,函数会检测到这一情况,这时它可以直接返回WAIT_OBJECT_0给调用线程。但是,就在函数返回之前,它会使事件变为非触发状态,这就是等待成功所引起的副作用。

猜你喜欢

转载自blog.csdn.net/wzz953200463/article/details/126612909