1. 程式人生 > >執行緒同步(windows平臺):事件

執行緒同步(windows平臺):事件

一:介紹

事件Event實際上是個核心物件,事件分兩種狀態:激發狀態和未激發狀態。分兩種型別:手動處置事件和自動處置事件。 手動處置事件被設定為激發狀態後,會喚醒所有等待的執行緒,一直保持為激發狀態,直到把它設定為未激發狀態。 自動處置事件被設定為激發狀態後,會喚醒一個等待中的執行緒,然後會自動設定成未激發狀態。

二:函式說明

建立事件物件:     HANDLE CreateEvent     (       LPSECURITY_ATTRIBUTES lpEventAttributes, // 安全屬性       BOOL bManualReset,     // 指定將事件物件建立成手動復原還是自動復原,true:手動事件;false:自動事件       BOOL bInitialState, // 初始狀態,true:有訊號狀態; false:無訊號狀態       LPCTSTR lpName         // 事件物件名稱     );

獲得事件物件:     DWORD WaitForSingleObject(              HANDLE hHandle,        //事件物件的控制代碼              DWORD dwMilliseconds    //0:測試物件的狀態立即返回;INFINITE:物件被觸發訊號後,函式才會返回     }

觸發事件:     BOOL SetEvent(HANDLEhEvent)     將事件設定成未觸發:     BOOL ResetEvent(HANDLEhEvent);

三:步驟

自動處置事件步驟: 1.宣告事件物件:Handle hEvent 2.建立事件物件:CreateEvent(NULL, FALSE, TRUE, NULL) 3.使用事件物件:WaitForSingleObject(hEvent, INFINITE) 4.重置事件物件:SetEvent(hEvent) 5.銷燬事件物件:CloseHandle(hEvent)

手動處置事件步驟: 1.宣告事件物件:Handle hEvent 2.建立事件物件:CreateEvent(NULL, TRUE, TRUE, NULL) 3.使用事件物件:WaitForSingleObject(hEvent, INFINITE) 4.重置為未啟用:ResetEvent(hEvent) 5.重置為啟用態:SetEvent(hEvent) 5.銷燬事件物件:CloseHandle(hEvent)

四:自動處置事件程式碼實現

/********************************************************
Copyright (C),  2016-2018,
FileName:		t13
Author:        	woniu201
Email:         	
[email protected]
Created: 2018/10/23 Description: 執行緒同步-事件 ********************************************************/ #include <iostream> #include <Windows.h> using namespace std; volatile int number = 1; HANDLE hEvent; DWORD CALLBACK ThreadFun1(LPVOID pParam) { while (1) { WaitForSingleObject(hEvent, INFINITE); cout << "Thread1:" << number++ << endl; SetEvent(hEvent); if (number >= 1000) { break; } } return 0; } DWORD CALLBACK ThreadFun2(LPVOID pParam) { while (1) { WaitForSingleObject(hEvent, INFINITE); cout << "Thread2:" << number++ << endl; SetEvent(hEvent); if (number >= 1000) { break; } } return 0; } int main() { //建立自動事件 hEvent = CreateEvent(NULL, false, true, NULL); CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL); CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL); getchar(); return 1; }

                                                                          

                                                                     掃更多技術文章掃碼關注微信公眾號