windows核心物件執行緒同步

2021-07-25 12:48:56 字數 3054 閱讀 2649

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

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,則不發出信標訊號。系統決不允許當前資源的數量為負值。當前資源數量決不能大於最大...

核心物件執行緒同步 概述

使用者方式同步的優點是它的 同步速度非常快。但它也有其侷限性。例如,互鎖函式家族只能在單值上執行,根本無法使執行緒進入等待狀態。可以使用關鍵 段使執行緒進入等待狀態,但是只能用這些 段對單個程序中的執行緒實施同步。還有,使用關鍵 段時,很容易陷入死鎖狀態,因為在等待進入關鍵 段時無法設定超時值。核心...