进程内核对象,是一个BOOBLE值,进程运行的时候内核对象处于未通知状态(FALSE),当进程终止的时候处于已通知状态(TRUE)。当线程等待的内核对象处于未通知状态时,线程不可调度。当内核对象变为已通知状态时线程立即变为可调度状态并投入运行。
可处于已通知态和为通知态的内和对象:
进程、线程、作业、文件、控制台输入、文件修改通知、事件、可等待计时器、信标、互斥对象
一、等待函数
等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。
- DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);
hObject标识一个能够支持被通知/未通知的内核对象。dwMilliseconds将等待对象变为已通知状态需要等待的时间,可以传递为INFINITE(该调用线程将永久等待下去,直到进程终止)INFINITE已经定义为0XFFFFFFFF(或-1)。不能为dwMilliseconds传递为0,否则函数立即返回。
该函数的返回值能够指明调用线程变为可调度状态的原因,WAIT_OBJECT_0线程等待的对象变为已通知状态,WAIT_TIMEOUT设置的等待时间已到。WAIT_FAILED给函数传递的值错误(可以调用GetLastError检测错误信息)。
- DWORD WaitForMultipleObjects(DWORD dwCount, CONST HANDLE* phObjects,
BOOL fWaitAll, DWORD dwMilliseconds);
dwCount要查看内核对象的数量(在1与MAXIMUMWAIT_OBJECTS[Windows头文件定义为64]之间的数)。phObjects指向内核对象句柄的数组的指针。fWaitAll若传递为TRUE(让线程进入等待状态,直到所有指定的内核对象都变为已通知状态前,不允许调用线程运行),若为FALSE(让线程进入等待状态,直到指定内核对象中的任何一个变为已通知状态)。dwMilliseconds将等待对象变为已通知状态需要等待的时间(如果规定的时间到了,那么该函数无论如何都会返回。如果传递为INFINITE则应考虑避免死锁发生)。
该函数的返回值指明调用线程变为可调度状态的原因,fWaitAll若传递为TRUE 则WAIT_OBJECT_0即所有对象均变为已通知状态。若为FALSE 则WAIT_OBJECT_x(x为0+ dwCount-1的一个值)即哪个对象变为已通知状态。WAIT_TIMEOUT设置的等待时间已到。WAIT_FAILED给函数传递的值错误。
- 成功等待的副作用
成功等待,指函数发现等待的特定对象变为已通知对象,且返回相对于WAIT_OBJECT_0的值。(返回WAIT_TIMEOUT或WAIT_FAILED则函数调用没有成功,对象的状态就不能改变)。
成功等待的副作用,当一个(被等待的)对象的状态改变时称为成功等待的副作用。
进程和线程内核对象就根本没有任何副作用,也就是说,在这些对象之一上进行等待决不会改变对
象的状态。
WaitForMultipleObjects是以原子操作方式运行的。当它检查内核对象的状态时,其他任何线程都无法背着对象改变它的状态。
如果多个线程等待单个内核对象,那么当该对象变成已通知状态时,系统“先进先出”的方案(等待了最长时间的线程将得到该对象)决定唤醒哪个线程