等待函式可使執行緒自願進入等待狀態,直到乙個特定的核心物件變為已通知狀態為止。
waitforsingleobject 函式
dword waitforsingleobject(
handle hobject,
dword dwmilliseconds
第乙個引數hobject標識乙個能夠支援被通知/未通知的核心物件(前面列出的任何一種物件都適用)。
第二個引數dwmilliseconds允許該執行緒指明,為了等待該物件變為已通知狀態,它將等待多長時間。(infinite為無限時間量,infinite已經定義為0xffffffff(或-1))
傳遞infinite
有些危險。如果物件永遠不變為已通知狀態,那麼呼叫執行緒永遠不會被喚醒,它將永遠處於死鎖狀態,不過,它不會浪費寶貴的c p u
時間。
例子:
dword dw = waitforsingleobject(hprocess, 5000);
switch(dw)
case wait_object_0:
// the process terminated.
break;
case wait_timeout:
// the process did not terminate within 5000 milliseconds.
break;
case wait_failed:
// bad call to function (invalid handle?)
break;
上面這個**告訴系統,在特定的程序(hprocess)終止執行(程序hprocess終止執行變成已經通知)之前,或者在5000m s時間結束之前,呼叫執行緒不應該變為可排程狀態。
waitforsingleobject
的返回值能夠指明呼叫執行緒為什麼再次變為可排程狀態。
如果執行緒等待的物件變為已通知狀態,那麼返回值是wait_object_0。
如果設定的超時已經到期,則返回值是wait_timeout。
如果將乙個錯誤的值(如乙個無效控制代碼)傳遞給waitforsingleobject,那麼返回值將是wait_failed(若要了解詳細資訊,可呼叫getlasterror)。
waitformultipleobjects函式
waitformultipleobjects函式與waitforsingleobject函式很相似,區別在於它允許呼叫執行緒同時檢視若干個核心物件的已通知狀態:
dword waitformultipleobjects(
dword dwcount,
const handle* phobjects,
bool fwaitall,
dword dwmilliseconds
dwcount
引數用於指明想要讓函式檢視的核心物件的數量。這個值必須在1與maximu m_wait_objects(在windows標頭檔案中定義為64)之間。
phobjects
引數是指向核心物件控制代碼的陣列的指標。
可以以兩種不同的方式來使用
waitformultipleobjects
函式。一種方式是讓執行緒進入等待狀態,直到指定核心物件中的任何乙個變為已通知狀態。
另一種方式是讓執行緒進入等待狀態,直到所有指定的核心物件都變為已通知狀態。
fwaitall
引數告訴該函式,你想要讓它使用何種方式。如果為該引數傳遞true,那麼在所有物件變為已通知狀態之前,該函式將不允許呼叫執行緒執行。
dwmilliseconds
引數的作用與它在waitforsingleobject中的作用完全相同。如果在等待的時候規定的時間到了,那麼該函式無論如何都會返回。。
waitformultipleobjects
函式的返回值告訴呼叫執行緒,為什麼它會被重新排程。可能的返回值是wait_failed和wait_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的控制代碼陣列中的索引。該索引說明哪個物件變為已通知狀態。
下面是說明這一情況的一些示例**
handle h[3];
h[0] = hprocess1;
h[1] = hprocess2;
h[2] = hprocess3;
dword dw = waitformultipleobjects(3, h, false, 5000);
switch(dw)
case wait_failed:
// bad call to function (invalid handle?)
break;
case wait_timeout:
// none of the objects became signaled within 5000 milliseconds.
break;
case wait_object_0 + 0:
// the process identified by h[0] (hprocess1) terminated.
break;
case wait_object_0 + 1:
// the process identified by h[1] (hprocess2) terminated.
break;
case wait_object_0 + 2:
// the process identified by h[2] (hprocess3) terminated.
break;
執行緒同步 核心物件實現執行緒同步 事件核心物件
1 事件核心物件23 事件型別物件有兩種不同型別,手動重置和自動重置 4手動重置 當乙個手動重置物件被觸發時候,等待該物件的所有執行緒變為可排程。5自動重置 當乙個自動重置物件被觸發時,只有乙個等待該事件的執行緒會變為可排程67 下面是乙個建立事件核心物件的函式 8handle createeven...
核心物件執行緒同步 信標核心物件
信標核心物件用於對資源進行計數。乙個使用數量 乙個是最大資源數量 用於標識信標能夠控制的資源的最大數量 乙個是當前資源數量 用於標識當前可以使用的資源的數量 如果當前資源的數量大於0,則發出信標訊號。如果當前資源數量是0,則不發出信標訊號。系統決不允許當前資源的數量為負值。當前資源數量決不能大於最大...
核心物件執行緒同步 概述
使用者方式同步的優點是它的 同步速度非常快。但它也有其侷限性。例如,互鎖函式家族只能在單值上執行,根本無法使執行緒進入等待狀態。可以使用關鍵 段使執行緒進入等待狀態,但是只能用這些 段對單個程序中的執行緒實施同步。還有,使用關鍵 段時,很容易陷入死鎖狀態,因為在等待進入關鍵 段時無法設定超時值。核心...