1. 程式人生 > >串列埠之WaitForSingleObjec、WaitForMultipleObjects函式詳解

串列埠之WaitForSingleObjec、WaitForMultipleObjects函式詳解

WaitForSingleObject函式

等待函式可使執行緒自願進入等待狀態,直到一個特定的核心物件變為已通知狀態為止。

DWORD WaitForSingleObject(

HANDLE hObject,

  DWORD dwMilliseconds

);

第一個引數hObject標識一個能夠支援被通知/未通知的核心物件(前面列出的任何一種物件都適用)。

第二個引數dwMilliseconds允許該執行緒指明,為了等待該物件變為已通知狀態,它將等待多長時間。(INFINITE無限時間量,INFINITE已經定義為0xFFFFFFFF(或-1))

傳遞INFINITE有些危險

如果物件永遠變為已通知狀態,那麼呼叫執行緒永遠不會被喚醒,它將永遠處於死鎖狀態,不過,它不會浪費寶貴的C P U時間。

WaitForMultipleObjects函式

WaitForMultipleObjects函式與WaitForSingleObject函式很相似,區別在於它允許呼叫執行緒同時檢視若干個核心物件的已通知狀態:

DWORD WaitForMultipleObjects(

DWORD dwCount,

 CONST HANDLE* phObjects,

 BOOL fWaitAll,

 DWORD dwMilliseconds

);

dwCount

引數用於指明想要讓函式檢視的核心物件的數量。這個值必須1MAXIMU M_WAIT_OBJECTS(在Windows標頭檔案中定義為64)之間。

phObjects引數是指向核心物件控制代碼的陣列的指標。

可以以兩種不同的方式來使用WaitForMultipleObjects函式

一種方式是讓執行緒進入等待狀態,直到指定核心物件中的任何一個變為已通知狀態。

另一種方式是讓執行緒進入等待狀態,直到所有指定的核心物件都變為已通知狀態。

fWaitAll引數告訴該函式,你想要讓它使用何種方式。如果為該引數傳遞TRUE,那麼在所有物件變為已通知狀態之前,該函式將不允許呼叫執行緒執行。

dwMilliseconds引數的作用與它在WaitForSingleObject中的作用完全相同。如果在等待的時候規定的時間到了,那麼該函式無論如何都會返回。。

WaitForMultipleObjects函式的返回值告訴呼叫執行緒,為什麼它會被重新排程。可能的返回值是WAIT_FAILEDWAIT_TIMEOUT。如果為fWaitAl l引數傳遞TRUE,同時所有物件均變為已通知狀態,那麼返回值是WAIT_OBJECT_0。如果為fWaitAll傳遞FALSE,那麼一旦任何一個物件變為已通知狀態,該函式便返回。在這種情況下,你可能想要知道哪個物件變為已通知狀態。返回值是WAIT_OBJECT_0與(WAIT_OJECT_0 + dwCount-1之間的一個值。換句話說,如果返回值不是WAIT_TIMEOUT,也不是WAIT_FAILED,那麼應該從返回值中減去WAIT_OBJECT_0。產生的數字是作為第二個引數傳遞給WaitForMultipleObjects的控制代碼陣列中的索引。該索引說明哪個物件變為已通知狀態。