等待函数使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。如果线程在调用一个等待函数的时候,相应的内核对象已经处于触发状态,那么线程是不会进入等待状态的。最常用是WaitForSingleObject。
- DWORD WaitForSingleObject(
- [in] HANDLE hHandle,
- [in] DWORD dwMilliseconds
- );
参数1:用来标识要等待的内核对象,这个内核对象可以处于触发状态或未触发状态。
参数2:用来指定线程最多愿意花多长的时间来等待对象被触发(超时时间,单位为毫秒)
-
- DWORD dw = WaitForSingleObject(hProcess, 5000);
- switch (dw)
- {
- case WAIT_OBJECT_0:
- break;
- case WAIT_TIMEOUT:
- break;
- case WAIT_FAILED:
- break;
- default:
- break;
- }
上述代码告诉系统,除非指定的进程已经被终止,或者等待时间满5000毫秒,否则不能对调用线程进行调用。
WaitForMultipleObjects与WaitForSingleObject相似,唯一的不同之处在于它允许调用线程同时检查多个内核对象的触发状态。函数如下:
- DWORD WaitForMultipleObjects(
- [in] DWORD nCount,
- [in] const HANDLE *lpHandles,
- [in] BOOL bWaitAll,
- [in] DWORD dwMilliseconds
- );
示例:
- 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;
- }
成功调用WaitForSingleObject或WaitForMultipleObjects事实上会改变对象的状态。一个成功的调用指的是函数发现已经被触发了,然后返回WAIT_OBJECT_0 ,如果不成功,则返回超时或者错误。这种情况下对象的状态是不会发生改变的。
如果对象的状态发生了改变,称为等待成功所引起的副作用。
举例:假设线程正在等待一个自动重置事件对象,当事件对象被触发时,函数会检测到这一情况,这时它可以直接返回WAIT_OBJECT_0给调用线程。但是,就在函数返回之前,它会使事件变为非触发状态,这就是等待成功所引起的副作用。