线程同步(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:             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编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

posted @ 2018-10-24 12:05  蜗牛201  阅读(204)  评论(0编辑  收藏  举报