線程同步(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)
四:自動處置事件代碼實現
1 /******************************************************** 2 Copyright (C), 2016-2018,3 FileName: t13 4 Author: woniu201 5 Email: [email protected] 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 }
線程同步(windows平臺):事件