VC之 執行緒同步之事件物件 Event

2021-07-12 00:56:13 字數 1306 閱讀 7687

事件物件也是核心物件,它也包含三個成員:使用計數、指明事件是自動重置事件還是乙個人工重置事件的布林值、指明事件是處於已通知狀態還是處於未通知狀態。

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

在擁有事件物件的所有權之後要呼叫resetevent函式手動地將事件物件重置為無訊號

狀態自動重置的事件物件:當乙個自動重置的事件物件得到通知時,等待該事件物件的執行緒中只有乙個執行緒變為可

排程執行緒。當執行緒得到事件物件的所有權之後,系統會自動將該物件設定為無訊號狀

態。建立事件物件:

handle createevent(

lpsecurity_attributes lpeventattributes,// pointer to security attributes

bool bmanualreset,  // flag for manual-reset event

bool binitialstate, // flag for initial state

lpctstr lpname 

// pointer to event-object name

); 第乙個引數如果為null表明使用預設的安全性。

第二個引數指明是人工重置事件物件還是自動重置事件物件,true為人工重置事件物件,false為自動重置

第三個引數指明事件物件的初始狀態,如果為true表明事件物件初始是有訊號狀態,否則無訊號狀態。

第四個引數是事件物件的名稱

判斷建立的事件物件是否已經存在同樣是呼叫getlasterror()函式判斷。

設定事件物件為有訊號狀態:setevent()表明將事件物件設定為有訊號狀態。

設定事件物件為無訊號狀態:resetevent()表明將事件物件設定為無訊號狀態。

請求事件物件:waitforsingleobject(handle,dowrd)與互斥物件一樣。只有當事件物件為有訊號狀態時該函式才會返回並執行以下語句,且之後要同時將事件物件設定為無訊號狀態,這樣別的執行緒才不能擁有事件物件,在保護的**完成之後再重新將事件物件設定為有訊號狀態,這樣其它執行緒才有機會獲得擁有權。

resetevent和setevent是要成對出現的。

人工事件物件:resetevent要手動呼叫。

自動事件物件:resetevent不要手動呼叫,系統會在waitforsingleobject之後自動將事件設定為無訊號狀態。

事件物件和互斥物件同樣存在乙個陷阱:即在建立事件物件的時候如果開始就設定無訊號狀態,則如果要想讓其它執行緒有機會得到擁有權就要將事件物件設定為有訊號狀態即呼叫setevent函式.

感謝

執行緒同步之事件物件

執行緒同步 讓執行緒協同步調,按照一定的先後次序來執行 當人工重置的事件得到通知時,等待該事件的所有執行緒均變為可排程執行緒。當乙個自動重置的事件得到通知時,等待該事件的執行緒中只有乙個執行緒變為可排程執行緒。參考 多執行緒與事件物件 多執行緒程式設計 13 多執行緒同步之 event 事件物件 i...

Windows執行緒同步之事件 Event

設定為有訊號狀態setevent 設定為無訊號狀態resetevent 傳送訊號脈衝pulseevent 開啟已存在的命名物件openevent 關閉事件物件closeevent 等待訊號為有訊號或超時waitforsingleobject 建立或開啟事件物件createevent event是wi...

核心態同步物件之「事件」

事件是一種很常使用到的,用於同步的核心物件。它分為兩種 手動擋的 自動擋的 手動擋 顧名思義,如果乙個事件啟用之後,你不顯式呼叫resetevent的話,那麼事件就一直處於啟用狀態。自動擋 在任何乙個執行緒waitfor函式成功之後,該事件就會被重新調整為未啟用狀態。手動擋的事件通常應用於這麼乙個場...