事件对象(Event Object),通过通知操作的方式来保持线程的同步,还可以方便实现对多个线程的优先级比较的操作。
  事件包含一个使用计数(与所有内核对象一样),一个BOOL值(用于指明该事件是个自动重置的事件还是一个人工重置的事件),还有一个BOOL值(用于指明该事件处于已通知状态还是未通知状态)。事件能够通知一个线程的操作已经完成。有两种类型的事件对象。一种是人工重置事件,另一种是自动重置事件。他们不同的地方在于:当人工重置的事件得到通知时,等待该事件的所有线程均变为可调度线程。当一个自动重置的事件得到通知时,等待该事件的线程中只有一个线程变为可调度线程。
   当一个线程执行初始化操作,然后通知另一个线程执行剩余的操作时,事件使用得最频繁。在这种情况下,事件初始化为未通知状态,然后,当该线程完成它的初始化操作后,它就将事件设置为已通知状态,而一直在等待该事件的另一个线程在事件已经被通知后,就变成可调度线程。
  上面理论也是我抄别人的,感觉解释的很好,索性就用了。不多说,直接上代码了。

#include <iostream>
#include <windows.h>
using namespace std;
DWORD WINAPI Thread1(LPVOID lpParmeter);
DWORD WINAPI Thread2(LPVOID lpParmeter);
static HANDLE g_hEvent  = INVALID_HANDLE_VALUE;
static int g_iCnt = 50;int main(int argc, char** argv)
{HANDLE thread1 = INVALID_HANDLE_VALUE;HANDLE thread2 = INVALID_HANDLE_VALUE;g_hEvent = CreateEvent(NULL, FALSE, FALSE, TEXT("Event"));if(!g_hEvent){cout<<" Event fail!"<<endl;return -1;}thread1 = CreateThread(NULL, 0, Thread1, NULL, 0, NULL);thread2 = CreateThread(NULL, 0, Thread2, NULL, 0, NULL);SetEvent(g_hEvent);Sleep(4000);            CloseHandle(thread1);   CloseHandle(thread2);return 0;
}DWORD WINAPI Thread1(LPVOID lpParmeter)
{while(1){WaitForSingleObject(g_hEvent, INFINITE);if(g_iCnt>0){Sleep(20);cout<<"THread1:"<<g_iCnt--<<endl;SetEvent(g_hEvent);}else{SetEvent(g_hEvent);break;}}   return 0;
}DWORD WINAPI Thread2(LPVOID lpParmeter)
{while(1){WaitForSingleObject(g_hEvent, INFINITE);if(g_iCnt>0){Sleep(20);cout<<"THread2:"<<g_iCnt--<<endl;SetEvent(g_hEvent);}else{SetEvent(g_hEvent);break;}}return 0;
}

事件对象(Event Object)的具体使用步骤(个人总结):
1、调用CreateEvent函数创建一个事件对象;
2、调用WaitForSingleObject函数等待线程;
3、调用SetEvent设置事件为有标记;
4、线程中使用完后调用ReleaseEvent来释放事件对象;
其具体的用法还分为手动事件和自动事件来处理,上面的程序使用的自动事件。

HANDLE CreateEvent(
LPSECURITY_ATTRIBUTES lpEventAttributes,
BOOL bManualReset, BOOL bInitialState, LPCTSTR lpName );
功能:创建一个事件对象。
参数:lpEventAttributes,事件对象的安全属性,使用默认的就是NULL。
参数: bManualReset,创建的Event是自动事件还是人工事件。如果true,人工复位,一旦该Event被设置为有信号,则它一直会等到ResetEvent()API被调用时才会恢复为无信号; 如果为false,Event被设置为有信号,则当有一个wait到它的Thread时,该Event就会自动复位,变成无信号。如果想在每次调用WaitForSingleObject 后让WINDOWS为您自动地把事件地状态恢复为无信号”状态,必须把该参数设为FALSE,否则,您必须每次调用ResetEvent函数来清除事件的信号。
参数:bInitialState,初始状态,true,有信号,false无信号
参数:lpName,事件对象的名称(也许在OpenEvent中需要使用此名称)。
返回值: 成功返回一个事件的句柄, 失败返回NULL。

BOOL WINAPI SetEvent(In HANDLE hEvent)
功能:将事件对象设置为有标记
参数:hEvent,事件对象的句柄
返回值:成功返回非0,失败返回0.

WaitForSingleObject函数在上一篇笔记已经解释,这里就不重复了。

  上面的的事件对象使用的自动事件对象,如果想使用人工事件对象,可以将CreateEvent函数的第二个参数设置为true就可以。上面的事件对象是基本应用,其更多的用法可以去查询下PulseEvent这个函数,你会有更多发现。

转载于:https://www.cnblogs.com/huiz/p/9610677.html

线程的同步互斥之事件对象(Event)相关推荐

  1. python线程死锁的原因,浅谈Python线程的同步互斥与死锁

    线程间通信方法 1. 通信方法 线程间使用全局变量进行通信 2. 共享资源争夺 共享资源:多个进程或者线程都可以操作的资源称为共享资源.对共享资源的操作代码段称为临界区. 影响 : 对共享资源的无序操 ...

  2. python同步锁和互斥锁的区别_浅谈Python线程的同步互斥与死锁

    这篇文章主要介绍了浅谈Python线程的同步互斥与死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 线程间通信方法 1. 通信 ...

  3. JavaScript:事件对象Event和冒泡

    本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 绑定事件的两种方式 我们在上一篇文章 DOM操作详解 中已经讲过事件的概 ...

  4. javaScript中的事件对象event是怎样

    事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包含了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...

  5. js进阶课程 12-9 jquery的事件对象event的方法有哪些?

    js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...

  6. [回顾]事件对象——event

    问题由来 经常在阅读代码时候发现这样的函数 var btn = document.getElementById('btn'); btn.onclick = function (e) {...一些操作: ...

  7. JS事件对象 (event)

    #事件对象 (event) div.onclick = function(event){         console.log(event);         let e = event||wind ...

  8. js的三大家族(offset/scroll/client)和一个事件对象(event)///正则

                  一  offset 第1章 offset家族 4 1.1 三大家族和一个事件对象 4 1.2 Offset家族简介 4 1.2.1 offsetWidth和offsetHi ...

  9. 事件对象(event)

    <div>111</div>var div = document.querySelector('div'); div.onclick = function(event) {}; ...

  10. 事件对象event及其相关属性

    事件对象event 一.什么是事件对象 二.事件对象的属性 1.事件对象的兼容性 2.事件对象的type属性 3.target 与currentTarget 4. 事件对象的keyCode属性 5.c ...

最新文章

  1. 敏捷开发日常跟进系列之二:燃尽图(中)
  2. dns服务器正则表达式验证,js如何对域名和ip进行校验?(正则表达式)
  3. visual studio 2019、2017、2015下载网址
  4. 短网址缩短和还原综合源码
  5. 有故事、有实践,谈一谈深度迁移学习方法的基本思路
  6. MongoDB之Java测试代码(DAO层)
  7. java+txt+词语+次数_Java练习2--读取txt文件统计考勤次数并写入一个txt文件中
  8. aardio部署_aardio有什么用
  9. 直播程序源码更简单的搭建方法
  10. Directx发展史
  11. 仿淘宝收货地址之三级联动
  12. Win10、win7、win8免费升级win11系统的方法
  13. 基于来信码的短信通知平台
  14. 全球与中国机器人随机装箱机市场深度研究分析报告
  15. 基于simulink采用 QSHB 和 HBPS 算法的混合 MIMO 波束成形仿真
  16. 大学生!如果让你选择计算机本科最重要的三门课,你会选什么?
  17. RDO(Remote Desktop Organizer)远程桌面工具分享
  18. 转转推荐场景EE题解决思路
  19. 基于JAVA+SpringMVC+Mybatis+Vue+MYSQL的医药销售管理系统
  20. 计算机xiuli教程,电脑上不去网维修教程

热门文章

  1. 双十二大前端工程师读书清单
  2. Yii2学习笔记(一):Yii的安装和使用(base版)
  3. 阿里云--域名,主机,备案都配置好了,就是不能访问网站的解决方案
  4. 用Nuget图形化界面打包类库(一)
  5. 网站SEO优化之Robots.txt文件写法。
  6. 解决屏蔽JS代码报错的问题
  7. nagios原装配置文件
  8. {Java}一个有关类属性初始化的有趣儿情况
  9. [Android] 软件中选择文件夹功能
  10. Unix 文件和目录