作者:shenzi
链接:http://blog.csdn.net/shenzi
我 们已经讨论了好几种内核对象,包括进程、线程以及作业。几乎所有这些内核对象都可以用来进行同步。对线程同步来说,这些内核对象中的每一种要么处于触发状 态,要么处于未触发状态。Microsooft为每种对象创建了一些规则,规定如何在这两种状态之间进行转换。用内核对象进行线程同步就是要用这些内核对 象的规则为线程同步服务。
2.等待函数
等待函数 使一个线程自愿进入等待状态,直到指定的内核对象被触发为止。注意,如果线程在调用一个等待函数的时候,相应的内核对象已经处于触发状态,那么线程时不会进入等待状态的。
DWORD WaitForSingleObject(
HANDLE hObject, //标识要等待的内核对象,这个内核对象可以处于触发或未触发状态;
DWORD dwMilliseconds); //指定线程最多愿意花多长的时间来等待对象被触发;
通常,我们会给dwMilliseconds传入INFINITE,但也可以传任何其它的值(以微妙微单位)。传INFINITE可能会有点危险。如果对象永远不被触发,那么调用线程将永远不会被唤醒——它会一直阻塞在那里,但幸运的是,它并没有浪费宝贵的CPU时间。
DWORD dw = WaitForSingleObject(hProcess, 5000);
switch (dw) {
case WAIT_OBJECT_0:
// 等待对象被触发,即等待进程已终止;
break;
case WAIT_TIMEOUT:
// 等待超时,即等待的进程在5000微妙内未终止;
break;
case WAIT_FAILED:
// 无效的参数,如无效的进程句柄
break;
}
前述代码告诉系统,除非指定的进程已经终止或者等待时间已满5000微妙,否则不应该对调用线程进行调度。如果进程已经终止,那么这个调用会在5000微妙内返回,如果进程尚未终止,那么这个调用大约会在5000微妙左右返回。注意,如果给dwMilliseconds传0,WaitForSingleObject总会立即返回,即使它要等待的条件还没有满足。
还有一个函数允许调用线程同时检查多个内核对象的触发状态:
DWORD WaitForMultipleObjects(
DWORD dwCount,//表示希望检查的内核对象的数量;最大值MAXIMUM_WAIT_OBJECTS=64
CONST HANDLE* phObjects,//指向内核对象句柄数组
BOOL bWaitAll,//TRUE,等待所有内核对象触发;FALSE,等待其中任一对象触发;
DWORD dwMilliseconds); //指定线程最多愿意花多长的时间来等待对象被触发;
HANDLE3];
h[0] = hProcess1;
h[1] = hProcess2;
h[2] = hProcess3;
DWORD dw = WaitForMultipleObjects(3, h, FALSE, 5000);
switch (dw) {