一:介紹
事件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)
四:自動處置事件程式碼實現
1 /******************************************************** 2 Copyright (C), 2016-2018, 3 FileName: t13 4 Author: woniu201 5 Email: wangpengfei.201@163.com 6 Created: 2018/10/23 7 Description: 執行緒同步-事件 8 ********************************************************/ 9 #include <iostream> 10 #include <Windows.h> 11 12 using namespace std; 13 14 volatile int number = 1; 15 HANDLE hEvent; 16 17 DWORD CALLBACK ThreadFun1(LPVOID pParam) 18 { 19 while (1) 20 { 21 WaitForSingleObject(hEvent, INFINITE); 22 cout << "Thread1:" << number++ << endl; 23 SetEvent(hEvent); 24 if (number >= 1000) 25 { 26 break; 27 } 28 29 } 30 return 0; 31 } 32 33 DWORD CALLBACK ThreadFun2(LPVOID pParam) 34 { 35 while (1) 36 { 37 WaitForSingleObject(hEvent, INFINITE); 38 cout << "Thread2:" << number++ << endl; 39 SetEvent(hEvent); 40 if (number >= 1000) 41 { 42 break; 43 } 44 } 45 return 0; 46 } 47 48 49 int main() 50 { 51 //建立自動事件 52 hEvent = CreateEvent(NULL, false, true, NULL); 53 54 CreateThread(NULL, 0, ThreadFun1, NULL, 0, NULL); 55 CreateThread(NULL, 0, ThreadFun2, NULL, 0, NULL); 56 57 getchar(); 58 return 1; 59 }
掃碼關注公眾號
專注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分散式,高併發,設計模式,爬蟲,docker,shell程式設計等相關技術,在這裡一起探討,一起學習,一起進步,不定期分享視訊書籍資源,充分利用碎片化時間,讓我們的技術之路更加有樂趣。