一:介绍

事件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: wangpengfei.201@163.com
Created: 2018/10/23
Description: 线程同步-事件
********************************************************/
#include <iostream>
#include <Windows.h> using namespace std; volatile int number = ;
HANDLE hEvent; DWORD CALLBACK ThreadFun1(LPVOID pParam)
{
while ()
{
WaitForSingleObject(hEvent, INFINITE);
cout << "Thread1:" << number++ << endl;
SetEvent(hEvent);
if (number >= )
{
break;
} }
return ;
} DWORD CALLBACK ThreadFun2(LPVOID pParam)
{
while ()
{
WaitForSingleObject(hEvent, INFINITE);
cout << "Thread2:" << number++ << endl;
SetEvent(hEvent);
if (number >= )
{
break;
}
}
return ;
} int main()
{
//创建自动事件
hEvent = CreateEvent(NULL, false, true, NULL); CreateThread(NULL, , ThreadFun1, NULL, , NULL);
CreateThread(NULL, , ThreadFun2, NULL, , NULL); getchar();
return ;
}

扫码关注公众号

专注分享Java,C/C++,STL,Spring框架,mybatis框架,mysql,redis,分布式,高并发,设计模式,爬虫,docker,shell编程等相关技术,在这里一起探讨,一起学习,一起进步,不定期分享视频书籍资源,充分利用碎片化时间,让我们的技术之路更加有乐趣。

线程同步(windows平台):事件的更多相关文章

  1. 线程同步(windows平台):信号量

    一:介绍 信号量也是系统核心对象,它允许多个线程同一时刻访问同一资源,但需限制同一时刻访问资源的最大线程数目. 信号量遵循规则:1.当前资源计数大于0,信号量有效.2.当前资源计数等于0,信号量无效. ...

  2. 线程同步(windows平台):互斥对象

    一:介绍 互斥对象是系统内核维护的一种数据结构,保证了对象对单个线程的访问权. 二:函数说明 创建互斥对象:    HANDLE CreateMutex(            LPSECURITY_ ...

  3. 线程同步(windows平台):临界区

    一:介绍 临界区指的是一个访问共用资源(例:全局变量)的程序片段,该共用资源无法同时被多个线程访问的特性.有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并 ...

  4. C++线程同步 -- windows

    简介: 在一般情况下,创建一个线程是不能提高程序的执行效率的,所以要创建多个线程.但是多个线程同时运行的时候可能调用线程函数,在多个线程同时对同一个内存地址进行写入, 由于CPU时间调度上的问题,写入 ...

  5. C#线程同步自动重置事件——AutoResetEvent

    AutoResetEvent对象用来进行线程同步操作,AutoResetEvent类继承waitHandle类. AutoResetEvent对象有终止和非终止两种状态,终止状态是线程继续执行,非终止 ...

  6. C#线程同步手动重置事件——ManualResetEvent

    和AutoResetEvent类的区别是,Manual一旦set后不会自动reset,会放行所有waitone的线程,而autoresetevent每一次set之后只会放行一个waitone的线程,然 ...

  7. Windows线程同步(下)

    线程同步三:事件 CreateEvent:Creates or opens a named or unnamed event object. HANDLE WINAPI CreateEvent( _I ...

  8. C++线程同步的四种方式(Windows)

    为什么要进行线程同步? 在程序中使用多线程时,一般很少有多个线程能在其生命期内进行完全独立的操作.更多的情况是一些线程进行某些处理操作,而其他的线程必须对其处理结果进行了解.正常情况下对这种处理结果的 ...

  9. C++ 线程同步的四种方式

    程之间通信的两个基本问题是互斥和同步. (1)线程同步是指线程之间所具有的一种制约关系,一个线程的执行依赖另一个线程的消息,当它没有得到另一个线程的消息时应等待,直到消息到达时才被唤醒. (2)线程互 ...

随机推荐

  1. 关于VBS的一个怪现象

    今天一个同学让我帮忙写一个程序,要求是: 输入一个n,返回从0到n中任意个数的组合,返回取异或结果为0的组合.来看VBS代码 n = p = "" ^n - s = s = s ) ...

  2. samba服务器共享开发【windows下开发linux网站】

    //@author:yuan<turing_zhy@163.com> //@date:2018-08-05 //注:码字不易转载请注明出处 //环境准备:ubuntu1~16.04.4 1 ...

  3. 分享我的第一个asp.net core开发过程

    .net core 这个东西感觉还是很不错的,学习了一下,并且做了一个微服务(IP地址查询服务) http://vju.cc/ip/ipquery 看上他的跨平台功能,所以就研究一下,中间有不少坑,有 ...

  4. 第一篇 Python的数据类型

    Python的标准数据类型有五种: (1)字符串 (2)数字(包括整数,浮点数,布尔,复数) (3)列表(list) (4)元组(tuple) (5)字典(dict) 注:使用type函数可以查看对象 ...

  5. slowhttptest安装及使用

    slowhttptest简介: Slowhttptest是依赖HTTP协议的慢速攻击DoS攻击工具,设计的基本原理是服务器在请求完全接收后才会进行处理,如果客户端的发送速度缓慢或者发送不完整,服务端为 ...

  6. IIS只允许某些IP访问

    1. 2. 3.访问时提示 4.设置允许访问的IP 5.指定的IP访问时没问题了,而其他的IP不允许访问

  7. Python爬虫:带参url的拼接

    如果连接直接这样写,看上去很直观,不过参数替换不是很方便,而且看着不舒服 https://www.mysite.com/?sortField=%E4%BA%BA%E5%B7%A5%E6%99%BA%E ...

  8. django 实现电子支付功能

    思路:调用第三方支付 API 接口实现支付功能.本来想用支付宝来实现第三方网站的支付功能的,但是在实际操作中发现支付宝没有 Python 接口,网上虽然有他人二次封装的的 Python 接口,但是对我 ...

  9. django中ModelForm解决多表单组合显示问题

    一.多表单组合显示问题 在项目中用ModelForm生成页面时 当有多表单组合显示时,会显示全部的关联表单数据. 而在实际项目中可能会出现只想让用户选择部分数据,这时候这样的显示就有问题. 二.问题解 ...

  10. 静态库(.a)与动态库(.so)的简明介绍

    静态库(.a)与动态库(.so)的简明介绍 gcc有很多关于静态库,动态库的选项如-l,-L,-fPIC,-shared -Wl,-soname,看着很复杂容易混淆,其实静态库和动态库都是应需而生,只 ...