MFC 執行緒同步 CEvent類

2021-07-24 17:05:05 字數 1453 閱讀 8498

cevent類

cevent類提供了對事件的支援。事件是乙個允許乙個執行緒在某種情況發生時,喚醒另外乙個執行緒的同步物件。事件告訴執行緒何時去執行某乙個給定的任務,從而使多個執行緒流平滑。

例如在某些網路應用程式中,乙個執行緒(記為a)負責監聽通訊埠,另乙個執行緒(記為b)負責更新使用者資料。通過使用cevent類,執行緒a可以通知執行緒b何時更新使用者資料,這樣執行緒b可以盡快地更新使用者資料。

每乙個cevent類物件可以有兩種狀態:有訊號狀態和無訊號狀態。

mfc中,cevent類物件有兩種型別:人工事件和自動事件。

自動事件:乙個自動的cevent物件在被至少乙個執行緒釋放後會自動返回到無訊號狀態。

人工事件:人工的cevent物件獲得訊號後,釋放可利用執行緒,但直到呼叫成員函式resetevent()才將其設定為無訊號狀態。

cevent類的建構函式:

cevent(bool binitiallyown = false,

//事件物件初始化狀態 ture有訊號,false無訊號

bool bmaualreset = false,

//指定建立的是人工事件還是自動事件,true為人工事件,false為自動事件

lpctstr lpszname = null,

//後兩個引數是cevent物件的名稱和安全屬性,通常設 為 null。

lpsecurity_attributes lpsaattribute = null);

改變cevent物件狀態的函式

bool setevent()函式

該函式將cevent類物件的狀態設定為有訊號狀態,並且釋放所有等待的執行緒; 

如果該事件是人工事件,則cevent類物件保持為有訊號狀態,直到呼叫成員函式resetevent()將其重新設為無訊號狀態時為止,這樣該事件就可以釋放多個執行緒;

如果該事件是自動事件,則在setevent()將事件設定為有訊號狀態後,cevent累物件有系統自動重置為無訊號狀態,除非乙個執行緒被釋放。

bool resetevent()函式

該函式將事件狀態設定為無訊號狀態,並保持該狀態直至setevent()被呼叫時為止。由於自動事件是由系統自動重置,故自動事件不需要呼叫該函式。

如下程式計算1 到 1000000的素數的個數並列印出個數。

cevent event; //定義個事件物件

void cthreadeventdlg::onprime()

uint calculateprime(lpvoid pparam)

} if (i >= k + 1)

}event.setevent(); //將事件物件啟用

return 0;

}

MFC 執行緒同步 CSemaphore類使用

csemaphore類 當需要乙個計數器來限制可以使用某個資源的執行緒數目時,即csemaphore類物件。csemaphore類的乙個物件儲存了對當前訪問某一指定資源的執行緒的計算值,該計數值是當前還可以使用該資源的執行緒的數目。如果這個計數達到了零,則所有對這個csemaphore類物件所控制的...

MFC 執行緒同步

使用waitforsingleobject函式來等待乙個核心物件變為已通知狀態 dword waitforsingleobject handle hobject,指明乙個核心物件的控制代碼 dword dwmilliseconds 等待時間 該函式需要傳遞乙個核心物件控制代碼,該控制代碼標識乙個核心...

C event執行緒安全

突然想到有關c 中使用event特性時關於執行緒安全的問題,以前雖然有遵從 複製引用 null判斷 的模式 盲目地 但沒有深入了解和思考。為之查詢了資料和實驗,對此有了進一步的理解。定義 field like event public event eventhandler done 類內raise ...