C++多執行緒--執行緒同步事件
阿新 • • 發佈:2018-12-11
1、事件
事件是核心物件,多用於執行緒間通訊,可以跨程序同步
2、事件使用
(1)建立事件
HANDLE CreateEvent(
LPSECURITY_ATTRIBUTE SlpEventAttributes,//安全控制,一般直接傳入NULL
BOOL bManualReset,//確定事件是手動還是自動
BOOL bInitialState,//事件的初始狀態
LPCTSTR lpName//事件的名稱
);
(2)開啟事件
HANDLE OpenEvent(
DWORD dwDesiredAccess,//表示訪問許可權
BOOL bInheritHandle, //事件控制代碼繼承性
LPCTSTR lpName //名稱
);
(3)觸發事件
BOOL SetEvent(HANDL EhEvent);
(4)設定未觸發
BOOL ResetEvent(HANDL EhEvent);
3、示例程式碼
#include <iostream> #include <Windows.h> using namespace std; static int number = 10; HANDLE event; DWORD WINAPI ThreadOne(LPVOID lpParameter) { cout << "視窗1售票開始"<< endl; while (1) { WaitForSingleObject(event, INFINITE); if (number > 0) { cout << "視窗1售出第" << number << "張票" << endl; --number; Sleep(1000); } SetEvent(event);//設定事件為觸發狀態 } return 0; } DWORD WINAPI ThreadTwo(LPVOID lpParameter) { cout << "視窗2售票開始" << endl; while (1) { WaitForSingleObject(event, INFINITE); if (number > 0) { cout << "視窗2售出第" << number << "張票" << endl; --number; Sleep(1000); } SetEvent(event); } return 0; } int main() { HANDLE HOne, HTwo; event = CreateEvent(NULL, FALSE, FALSE, NULL); SetEvent(event); HOne = CreateThread(NULL, 0, ThreadOne, NULL, 0, NULL); HTwo = CreateThread(NULL, 0, ThreadTwo, NULL, 0, NULL); CloseHandle(HOne); CloseHandle(HTwo); while (TRUE) { if (number == 0) { cout << "不好意思,票賣完了!" << endl; CloseHandle(event); return 0; } else { continue; } } system("Pause"); return 0; }