第九章 執行緒與核心物件的同步(1)

2021-09-08 06:52:26 字數 2095 閱讀 1675

程序核心物件,是乙個

booble

值,程序執行的時候核心物件處於未通知狀態(

false

),當程序終止的時候處於已通知狀態

(true)

。當執行緒等待的核心物件處於未通知狀態時,執行緒不可排程。當核心物件變為已通知狀態時執行緒立即變為可排程狀態並投入執行。

可處於已通知態和為通知態的內和物件:

程序、執行緒、作業、檔案、控制台輸入、檔案修改通知、事件、可等待計時器、信標、互斥物件

一、等待函式

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

dword waitforsingleobject(handle hobject, dword dwmilliseconds);

hobject

標識乙個能夠支援被通知

/未通知的核心物件。

dwmilliseconds

將等待物件變為已通知狀態需要等待的時間

,可以傳遞為

infinite

(該呼叫執行緒將永久等待下去,直到程序終止)

infinite

已經定義為

0xffffffff(

或-1)

。不能為

dwmilliseconds

傳遞為0

,否則函式立即返回。

該函式的返回值能夠指明呼叫執行緒變為可排程狀態的原因,

wait_object_0

執行緒等待的物件變為已通知狀態,

wait_timeout

設定的等待時間已到。

wait_failed

給函式傳遞的值錯誤(可以呼叫

getlasterror

檢測錯誤資訊)。

dword waitformultipleobjects(dword dwcount, const handle* phobjects,

bool fwaitall, dword dwmilliseconds);

dwcount

要檢視核心物件的數量(在1與

maximumwait_objects[windows

標頭檔案定義為

64]之間的數)。

phobjects

指向核心物件控制代碼的陣列的指標。

fwaitall

若傳遞為

true

(讓執行緒進入等待狀態,直到所有指定的核心物件都變為已通知狀態前,不允許呼叫執行緒執行),若為

false

(讓執行緒進入等待狀態,直到指定核心物件中的任何乙個變為已通知狀態)。

dwmilliseconds

將等待物件變為已通知狀態需要等待的時間(如果規定的時間到了,那麼該函式無論如何都會返回。如果傳遞為

infinite

則應考慮避免死鎖發生)。

該函式的返回值指明呼叫執行緒變為可排程狀態的原因,

fwaitall

若傳遞為

true

則wait_object_0

即所有物件均變為已通知狀態。若為

false

則wait_object_x(x

為0+ dwcount-1

的乙個值)即哪個物件變為已通知狀態。

wait_timeout

設定的等待時間已到。

wait_failed

給函式傳遞的值錯誤。

成功等待的***

成功等待,指函式發現等待的特定物件變為已通知物件,且返回相對於

wait_object_0

的值。(返回

wait_timeout

或wait_failed

則函式呼叫沒有成功,物件的狀態就不能改變)。

成功等待的***,當乙個(被等待的)物件的狀態改變時稱為成功等待的***。

程序和執行緒核心物件就根本沒有任何***,也就是說,在這些物件之一上進行等待決不會改變對

象的狀態。

waitformultipleobjects

是以原子操作方式執行的。當它檢查核心物件的狀態時,其他任何執行緒都無法揹著物件改變它的狀態。

如果多個執行緒等待單個核心物件,那麼當該物件變成已通知狀態時,系統「先進先出」的方案(等待了最長時間的執行緒將得到該物件)決定喚醒哪個執行緒

第九章 執行緒與核心物件的同步(2)

二 事件核心物件 事件核心物件是所有的核心物件中最基本的物件。包含乙個使用計數 與所有核心物件一樣 乙個用於指明該事件是自動重置的事件還是人工重置的事件的布林值。乙個用於指明該事件處於已通知狀態還是未通知狀態的布林值。事件核心物件的型別 人工重置的事件核心物件,事件得到通知時,等待該事件的所有執行緒...

第九章 執行緒與核心物件的同步(6)

六 其他的執行緒同步函式 1 非同步裝置 i o 非同步裝置 i o使得執行緒能夠啟動乙個讀操作或寫操作,但是不必等待讀操作或寫操作完成。裝置物件是可以同步的核心物件,可以呼叫 waitforsingleobject 函式傳遞檔案 套接字和通訊埠的控制代碼。當系統執行非同步 i o時,裝置物件處於未...

第九章 執行緒與核心物件的同步(2)

二 事件核心物件 事件核心物件是所有的核心物件中最基本的物件。包含乙個使用計數 與所有核心物件一樣 乙個用於指明該事件是自動重置的事件還是人工重置的事件的布林值。乙個用於指明該事件處於已通知狀態還是未通知狀態的布林值。事件核心物件的型別 人工重置的事件核心物件,事件得到通知時,等待該事件的所有執行緒...