執行緒同步(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;
}
掃更多技術文章掃碼關注微信公眾號