第九章 线程与内核对象的同步(1)

进程内核对象,是一个BOOBLE值,进程运行的时候内核对象处于未通知状态(FALSE),当进程终止的时候处于已通知状态(TRUE)。当线程等待的内核对象处于未通知状态时,线程不可调度。当内核对象变为已通知状态时线程立即变为可调度状态并投入运行。

可处于已通知态和为通知态的内和对象:

进程、线程、作业、文件、控制台输入、文件修改通知、事件、可等待计时器、信标、互斥对象

一、等待函数

等待函数可使线程自愿进入等待状态,直到一个特定的内核对象变为已通知状态为止。

  1. DWORD WaitForSingleObject(HANDLE hObject, DWORD dwMilliseconds);

hObject标识一个能够支持被通知/未通知的内核对象。dwMilliseconds将等待对象变为已通知状态需要等待的时间,可以传递为INFINITE(该调用线程将永久等待下去,直到进程终止)INFINITE已经定义为0XFFFFFFFF(-1)。不能为dwMilliseconds传递为0,否则函数立即返回。

该函数的返回值能够指明调用线程变为可调度状态的原因,WAIT_OBJECT_0线程等待的对象变为已通知状态,WAIT_TIMEOUT设置的等待时间已到。WAIT_FAILED给函数传递的值错误(可以调用GetLastError检测错误信息)。

  1. DWORD WaitForMultipleObjects(DWORD dwCount, CONST HANDLE* phObjects,

BOOL fWaitAll, DWORD dwMilliseconds);

dwCount要查看内核对象的数量(在1MAXIMUMWAIT_OBJECTS[Windows头文件定义为64]之间的数)。phObjects指向内核对象句柄的数组的指针。fWaitAll若传递为TRUE(让线程进入等待状态,直到所有指定的内核对象都变为已通知状态前,不允许调用线程运行),若为FALSE(让线程进入等待状态,直到指定内核对象中的任何一个变为已通知状态)。dwMilliseconds将等待对象变为已通知状态需要等待的时间(如果规定的时间到了,那么该函数无论如何都会返回。如果传递为INFINITE则应考虑避免死锁发生)。

该函数的返回值指明调用线程变为可调度状态的原因,fWaitAll若传递为TRUE WAIT_OBJECT_0即所有对象均变为已通知状态。若为FALSE WAIT_OBJECT_xx0+ dwCount-1的一个值)即哪个对象变为已通知状态。WAIT_TIMEOUT设置的等待时间已到。WAIT_FAILED给函数传递的值错误。

  1. 成功等待的副作用

成功等待,指函数发现等待的特定对象变为已通知对象,且返回相对于WAIT_OBJECT_0的值。(返回WAIT_TIMEOUTWAIT_FAILED则函数调用没有成功,对象的状态就不能改变)。

成功等待的副作用,当一个(被等待的)对象的状态改变时称为成功等待的副作用。

进程和线程内核对象就根本没有任何副作用,也就是说,在这些对象之一上进行等待决不会改变对

象的状态。

WaitForMultipleObjects是以原子操作方式运行的。当它检查内核对象的状态时,其他任何线程都无法背着对象改变它的状态。

如果多个线程等待单个内核对象,那么当该对象变成已通知状态时,系统“先进先出”的方案(等待了最长时间的线程将得到该对象)决定唤醒哪个线程

原文地址:https://www.cnblogs.com/dyufei/p/2573986.html