注:Windows下创建的Object都会被赋予一个状态量。如果Object被激活了,或者正在使用,那么该Object就是无信号,也就是不可用;另一方面,如果Object可用了,那么它就恢复有信号了。
一、WaitForSingleObject()函数
1、格式
DWORD WaitForSingleObject( HANDLE hHandle, DWORD dwMilliseconds);
有两个参数,分别是THandle和Timeout(毫秒单位)。
如果想要等待一条线程,那么你需要指定线程的Handle,以及相应的Timeout时间。当然,如果你想无限等待下去,Timeout参数可以指定系统常量INFINITE。
2、使用对象
它可以等待如下几种类型的对象:
Event,Mutex,Semaphore,Process,Thread
3.返回类型
有三种返回类型:
WAIT_OBJECT_0, 表示等待的对象有信号(对线程来说,表示执行结束);
WAIT_TIMEOUT, 表示等待指定时间内,对象一直没有信号(线程没执行完);
WAIT_ABANDONED 表示对象有信号,但还是不能执行 一般是因为未获取到锁或其他原因
该函数的参数hHandle是一个事件的句柄,第二个参数dwMilliseconds是时间间隔。如果事件是有信号状态返回WAIT_OBJECT_0,如果时间超过dwMilliseconds值但时间事件还是无信号状态则返回WAIT_TIMEOUT。
注:该函数的优点它在等待的过程中会进入一个非常高效沉睡状态,只占用极少的CPU时间片。(这个函数是在内核状态下等待内核对象,不切换到用户模式下,因而效率很高)
二、
DWORD WaitForMultipleObjects(DWORD dwCount, CONST HANDLE * phObjects, BOOL fWaitAll, DWORD dwMillseconds);
dwCount 该参数参数指明函数要查看的内核对象的数量。
phObjects参数是指向内核对象句柄的数组的指针。
可以以两种不同的方式来使用WaitForMultipleObjects函数
1 让线程进入等待状态,直到指定内核对象中任何一个变为已通知状态
2 让线程进入等待状态,直到所有指定的内核对象都变为已通知状态。
fWaitAll参数告诉该函数使用何种方式。如果为该参数传递TRUE,那么在所有对象变为已通知状态之前,该函数不允许调用线程运行。
dwMillseconds 参数的作用与它在WaitForSingObject中的作用完全相同。如果等待规定的时间到了,那么该函数无论如何都会返回。同样,通常为该参数传递INFINITE,但是在编写代码时候应该小心,以避免出现死锁情况。
WaitForMultipleObjects函数的返回值告诉调用线程,为什么它会被重新调度。可能的返回值是WAIT_FAILED和WAIT_TIMEOUT,这两个值的作用是很清楚的。如果fWaitALL参数传递TRUE,同时所有对象均变为已通知状态,那么返回值是WAIT_OBJECT_0。如果fWaitAll传递FALSE,那么一旦任何一个对象变为已通知状态,该函数变返回。这种情况下,如果想要知道哪个对象变为已通知状态。返回值是WAIT_OBJECT_0与(WAIT_OBJECT_0+dwCount-1)之间的一个值。也就是说,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那么应该从返回值中减去WAIT_OBJECT_0。产生的数字是作用第二个参数传递给WaitForMultipleObjects的句柄数组中的索引。该索引说明哪个对象变为已通知状态。
三、 SetEvent/ResetEvent
SetEvent/ResetEvent分别将EVENT置为这两种状态分别是发信号与不发信号。
WaitForSingleObject()等待,直到参数所指定的OBJECT成为发信号状态时才返回,OBJECT可以是EVENT,也可以是其它内核对象。