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

2021-04-28 16:08:45 字數 1832 閱讀 8853

二、事件核心物件

事件核心物件是所有的核心物件中最基本的物件。包含乙個使用計數(與所有核心物件一樣)

,乙個用於指明該事件是自動重置的事件還是人工重置的事件的布林值。乙個用於指明該事件處於已通知狀態還是未通知狀態的布林值。

事件核心物件的型別:

人工重置的事件核心物件,事件得到通知時,等待該事件的所有執行緒均變為可排程執行緒。

自動重置的事件核心物件,事件得到通知時,等待該事件的執行緒中只有乙個執行緒變為可排程執行緒。

事件的使用(乙個執行緒執行初始化操作,然後通知另乙個執行緒執行剩餘操作時用得最多)

事件初始化為未通知狀態,然後,當該執行緒完成它的初始化操作後,它就將事件設定為已通知狀態。這時,一直在等待該事件的另乙個執行緒發現該事件已經得到通知,因此它就變成可排程執行緒。這第二個執行緒知道第乙個執行緒已經完成了它的操作。

建立事件核心物件:

handle createevent(psecurity_attributes psa, bool fmanualreset,

bool finitialstate, pctstr pszname);

psa指向

security_attributes

結構的指標,確定返回的控制代碼是否可被子程序繼承。如果是

null

此控制代碼不能被繼承。

fmanualreset

指定事件物件的型別,

true

(人工重置的事件)

false(

自動重置的事件)。

finitialstate

指定事件初始化為已通知狀態(

true),

還是未通知狀態(

false)。

pszname

指定事件物件的名字,如果與乙個存在的命名的事件物件的名稱相同,函式將請求

event_all_access

來訪問存在的物件。這時候,由於

fmanualreset

和finitialstate

這兩個引數將被忽略。如果

psa不是

null

,將確定此控制代碼是否可以被繼承,但是其安全描述符成員將被忽略。 如果

lpname

為null

,將建立乙個無名的事件物件。如果

lpname

的和乙個存在的訊號、互斥、等待計時器、作業或者是檔案對映物件名稱相同,函式將會失敗,在

getlasterror

函式中將返回

error_invalid_handle

。造成這種現象的原因是這些物件共享同乙個命名空間。

createevent

返回事件物件的控制代碼,其他程序中的執行緒可以訪問該事件物件。方法是使用繼承性,用

duplicatehandle

函式等來呼叫

createevent

,或呼叫

openevent ,

在pszname

引數中設定乙個與呼叫

createevent

時設定的名字相匹配的名字。當不需要該事件物件時呼叫

closehandle

函式將其釋放。

handle openevent(dword fdwaccess, bool finherit, pctstr pszname);

設定事件核心物件

bool setevent(handle hevent); //

將事件設為已通知狀態

bool resetevent(handle hevent); //

將事件設為未通知狀態

bool pulseevent(handle hevent); //

使得事件變為已通知狀態,然後立即變為未通知狀態

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

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

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

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

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

程序核心物件,是乙個 booble 值,程序執行的時候核心物件處於未通知狀態 false 當程序終止的時候處於已通知狀態 true 當執行緒等待的核心物件處於未通知狀態時,執行緒不可排程。當核心物件變為已通知狀態時執行緒立即變為可排程狀態並投入執行。可處於已通知態和為通知態的內和物件 程序 執行緒 ...