事件内核对象 CreateEvent
事件内核对象是在线程同步时比较常用的内核对象。
一个事件内核对象的触发表示一个操作已经完成。有两种类型的事件内核对象:手动重置事件和自动重置事件。
当一个手动重置对象被触发的时候,正在等待该事件的所有线程都将变成可调度状态。而当一个自动重置事件被触发时,只有一个正在等待该事件的线程会变成可调度状态。
事件内核对象最通常的用途是:让一个线程执行初始化工作,然后触发另一个线程,让他执行剩余的工作,一开始的时候我们将时间初始化为未触发状态,然后当线程完成初始化工作的时候触发事件。此时,另一个线程一直在等待该事件,它发现事件被触发,于是变成可调度状态,第二个线程知道第一个线程已经完成了他的工作。
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes,// 安全属性 BOOLb ManualReset,// 复位方式 BOOLb InitialState,// 初始状态 LPCTSTR lpName // 对象名称
);
参数bManualReset是一个布尔值,用来告诉系统应该创建一个手动重置时间(TRUE)还是一个自动重置时间(FALSE)。
参数bInitialState表示应该事件初始化为触发状态(TRUE)还是未触发状态(FALSE)。
当系统插件事件对象之后,返回一个事件内核对象。
还有一个是CreateEvent的增强版CreateEventEx。
其他进程中的线程可以通过多种方式来访问该事件对象,这包括调用CreateEvent并在pszName参数中传入相同的值,使用继承,使用DuplicateHandle函数或者调用OpenEvent并在pszName参数指定与CreateEvent中相同的名字:
HANDLE OpenEvent( DWORD dwDesiredAccess, BOOL bInherit, PCTSTR pszName
);
一旦我们不需要事件内核对象的时候调用closehandlel来关闭。通过调用SetEvent可以直接控制它的状态,变成触发状态,使用ResetEvent使得事件变成未触发状态。
BOOL SetEvent(HANDLE hEvent);
BOOL ResetEvent(HANDLE hEvent);
简单的例子
HANDLE g_hEvent;
int main() { g_hEvent=CreateEvent(NULL,true,false,NULL); HANDLE hThread=CreateThread NULL,0,Thread1,NULL,0,NULL); //打开文件并读取内存。 SetEvent(g_hEvent);//通知Thread1开始运行。 //其他操纵。 } DWORD WINAPI Thread1(PVOID param) { WatiForSingleObject(g_hEvent,INFINITE); //访问内存。 ResetEvent(g_hEvent); }
事件内核对象 CreateEvent相关推荐
- 异步I/O 设备内核对象,事件内核对象,可提醒I/O 接收I/O通知
CreateFile SetFilePointerEx SetEndOfFile FlushFileBuffers 类似FILE_FLAG_WRITE_THROUGH功能 在异步I/O请求完成之前,一 ...
- Chapter09-内核模式下的线程同步之事件内核对象
有两种事件内核对象:自动事件和手动事件.当手动事件被触发时,所以该事件的等待线程都编程可调度状态:而自动事件被触发时,只有个一个等待该事件线程变成可调度状态. 下面再逐个讲解Event的相关函数: a ...
- 线程同步-事件内核对象
事件内核对象:两种状态,受信状态与未受信状态,3个成员: nUsageCount(使用计数): bManualReset(是否人工重置): bSignagled(是否受信). 基本函数: HANDLE ...
- Windows进程同步之事件内核对象(Event)
在所有的内核对象中,事件内核对象比其他的简单的多,可以用事件内核对象对不同进程进行同步. 事件内核对象主要包括三个部分:使用计数,一个表示是自动还是手动重置事件的布尔值,一个表示是否有信号的布尔值. ...
- 线程同步--事件内核对象
现实程序中有时候我们需要对线程执行顺序更加严格的要求. 前面讲到的关键代码段就不适用了. 关键代码段最大的有点就是用户在用户态执行就可以了,不需要进入内核状态.从而减少了进入内核所用的时间. 所以如果 ...
- windows C/C++ 内核对象、事件对象、信号量
承接上一篇:https://blog.csdn.net/uVarAndMethod/article/details/90360838 1.内核对象: 进程.线程.文件.文件映射.事件.互斥体等等 2. ...
- 线程与内核对象的同步——Windows核心编程学习手札之九
线程与内核对象的同步 --Windows核心编程学习手札之九 用户方式下的线程同步机制具有速度快的特点,但有其局限性,对于许多应用程序来说,并不合适.例如,互锁函数家族只能在单值上运行,根本无法使线程 ...
- 内核对象用于线程同步
事件内核对象 等待成功所引起的副作用,当事件对象被触发的时候,函数会检测到这一情况,这里它可以直接返回WAIT_OBJECT_0给调用线程,但是在函数返回之前, 它会使事件变为非触发状态---这就是副 ...
- 用内核对象进行线程同步
本章讨论的是如何使用内核对象来对线程进行同步,与用户模式下的同步机制相比,内核对象的用途要广泛的多.实际上,内核对象唯一的缺点就是他们的性能.当我们调用本章任何一个新函数时,调用线程必须从用户模式切换 ...
最新文章
- 械模拟计算器 - 计算尺
- 【BIEE】BI Publisher下拉菜单设置
- 使用VC++ 读取显示DEM文件
- 2018.12.15
- E: Unable to lock the administration directory (/var/lib/dpkg/)
- Android之编译jni出错解决办法
- 基于DirectShow的流媒体解码和回放
- Java虚拟机(十一)——执行引擎
- 孙宇晨回顾区块链历程:不走热点走心
- 关于pycharm安装出现的interpreter field is empty,无法创建项目存储位置
- 待解决的问题 POJ 3225 Help with Intervals 线段树 码力
- ggplot做双曲线阈值火山图
- 原型设计工具——墨刀
- 无源贴片晶振四角引脚_如何区分贴片晶振的脚位方向
- frontend -- 框架
- Pie-1-南丁格尔玫瑰图-中心带文字
- Linux环境下查看日志文件命令详解
- 2022-2027年中国蛋白质粉行业市场深度分析及投资战略规划报告
- 树莓派+USB摄像头自制网络摄像头
- OFD开发系列(一)-添加水印