线程的同步互斥之事件对象(Event)
事件对象(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)相关推荐
- python线程死锁的原因,浅谈Python线程的同步互斥与死锁
线程间通信方法 1. 通信方法 线程间使用全局变量进行通信 2. 共享资源争夺 共享资源:多个进程或者线程都可以操作的资源称为共享资源.对共享资源的操作代码段称为临界区. 影响 : 对共享资源的无序操 ...
- python同步锁和互斥锁的区别_浅谈Python线程的同步互斥与死锁
这篇文章主要介绍了浅谈Python线程的同步互斥与死锁,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧 线程间通信方法 1. 通信 ...
- JavaScript:事件对象Event和冒泡
本文最初发表于博客园,并在GitHub上持续更新前端的系列文章.欢迎在GitHub上关注我,一起入门和进阶前端. 以下是正文. 绑定事件的两种方式 我们在上一篇文章 DOM操作详解 中已经讲过事件的概 ...
- javaScript中的事件对象event是怎样
事件对象event,每当一个事件被触发的时候,就会随之产恒一个事件对象event,该对象中主要包含了关于该事件的基本属性,事件类型type(click.dbclick等值).目标元素target(我的 ...
- js进阶课程 12-9 jquery的事件对象event的方法有哪些?
js进阶课程 12-9 jquery的事件对象event的方法有哪些? 一.总结 一句话总结:三组六个,阻止默认事件一组,阻止冒泡一组,阻止冒泡和剩余事件一组. 1.事件的默认动作指什么? 比如点a标 ...
- [回顾]事件对象——event
问题由来 经常在阅读代码时候发现这样的函数 var btn = document.getElementById('btn'); btn.onclick = function (e) {...一些操作: ...
- JS事件对象 (event)
#事件对象 (event) div.onclick = function(event){ console.log(event); let e = event||wind ...
- js的三大家族(offset/scroll/client)和一个事件对象(event)///正则
一 offset 第1章 offset家族 4 1.1 三大家族和一个事件对象 4 1.2 Offset家族简介 4 1.2.1 offsetWidth和offsetHi ...
- 事件对象(event)
<div>111</div>var div = document.querySelector('div'); div.onclick = function(event) {}; ...
- 事件对象event及其相关属性
事件对象event 一.什么是事件对象 二.事件对象的属性 1.事件对象的兼容性 2.事件对象的type属性 3.target 与currentTarget 4. 事件对象的keyCode属性 5.c ...
最新文章
- 敏捷开发日常跟进系列之二:燃尽图(中)
- dns服务器正则表达式验证,js如何对域名和ip进行校验?(正则表达式)
- visual studio 2019、2017、2015下载网址
- 短网址缩短和还原综合源码
- 有故事、有实践,谈一谈深度迁移学习方法的基本思路
- MongoDB之Java测试代码(DAO层)
- java+txt+词语+次数_Java练习2--读取txt文件统计考勤次数并写入一个txt文件中
- aardio部署_aardio有什么用
- 直播程序源码更简单的搭建方法
- Directx发展史
- 仿淘宝收货地址之三级联动
- Win10、win7、win8免费升级win11系统的方法
- 基于来信码的短信通知平台
- 全球与中国机器人随机装箱机市场深度研究分析报告
- 基于simulink采用 QSHB 和 HBPS 算法的混合 MIMO 波束成形仿真
- 大学生!如果让你选择计算机本科最重要的三门课,你会选什么?
- RDO(Remote Desktop Organizer)远程桌面工具分享
- 转转推荐场景EE题解决思路
- 基于JAVA+SpringMVC+Mybatis+Vue+MYSQL的医药销售管理系统
- 计算机xiuli教程,电脑上不去网维修教程