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

蝸牛201發表於2018-10-24

一:介紹

事件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程式設計等相關技術,在這裡一起探討,一起學習,一起進步,不定期分享視訊書籍資源,充分利用碎片化時間,讓我們的技術之路更加有樂趣。

相關文章