事件内核对象是在线程同步时比较常用的内核对象。

一个事件内核对象的触发表示一个操作已经完成。有两种类型的事件内核对象:手动重置事件和自动重置事件。

当一个手动重置对象被触发的时候,正在等待该事件的所有线程都将变成可调度状态。而当一个自动重置事件被触发时,只有一个正在等待该事件的线程会变成可调度状态。

事件内核对象最通常的用途是:让一个线程执行初始化工作,然后触发另一个线程,让他执行剩余的工作,一开始的时候我们将时间初始化为未触发状态,然后当线程完成初始化工作的时候触发事件。此时,另一个线程一直在等待该事件,它发现事件被触发,于是变成可调度状态,第二个线程知道第一个线程已经完成了他的工作。

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相关推荐

  1. 异步I/O 设备内核对象,事件内核对象,可提醒I/O 接收I/O通知

    CreateFile SetFilePointerEx SetEndOfFile FlushFileBuffers 类似FILE_FLAG_WRITE_THROUGH功能 在异步I/O请求完成之前,一 ...

  2. Chapter09-内核模式下的线程同步之事件内核对象

    有两种事件内核对象:自动事件和手动事件.当手动事件被触发时,所以该事件的等待线程都编程可调度状态:而自动事件被触发时,只有个一个等待该事件线程变成可调度状态. 下面再逐个讲解Event的相关函数: a ...

  3. 线程同步-事件内核对象

    事件内核对象:两种状态,受信状态与未受信状态,3个成员: nUsageCount(使用计数): bManualReset(是否人工重置): bSignagled(是否受信). 基本函数: HANDLE ...

  4. Windows进程同步之事件内核对象(Event)

    在所有的内核对象中,事件内核对象比其他的简单的多,可以用事件内核对象对不同进程进行同步. 事件内核对象主要包括三个部分:使用计数,一个表示是自动还是手动重置事件的布尔值,一个表示是否有信号的布尔值. ...

  5. 线程同步--事件内核对象

    现实程序中有时候我们需要对线程执行顺序更加严格的要求. 前面讲到的关键代码段就不适用了. 关键代码段最大的有点就是用户在用户态执行就可以了,不需要进入内核状态.从而减少了进入内核所用的时间. 所以如果 ...

  6. windows C/C++ 内核对象、事件对象、信号量

    承接上一篇:https://blog.csdn.net/uVarAndMethod/article/details/90360838 1.内核对象: 进程.线程.文件.文件映射.事件.互斥体等等 2. ...

  7. 线程与内核对象的同步——Windows核心编程学习手札之九

    线程与内核对象的同步 --Windows核心编程学习手札之九 用户方式下的线程同步机制具有速度快的特点,但有其局限性,对于许多应用程序来说,并不合适.例如,互锁函数家族只能在单值上运行,根本无法使线程 ...

  8. 内核对象用于线程同步

    事件内核对象 等待成功所引起的副作用,当事件对象被触发的时候,函数会检测到这一情况,这里它可以直接返回WAIT_OBJECT_0给调用线程,但是在函数返回之前, 它会使事件变为非触发状态---这就是副 ...

  9. 用内核对象进行线程同步

    本章讨论的是如何使用内核对象来对线程进行同步,与用户模式下的同步机制相比,内核对象的用途要广泛的多.实际上,内核对象唯一的缺点就是他们的性能.当我们调用本章任何一个新函数时,调用线程必须从用户模式切换 ...

最新文章

  1. 械模拟计算器 - 计算尺
  2. 【BIEE】BI Publisher下拉菜单设置
  3. 使用VC++ 读取显示DEM文件
  4. 2018.12.15
  5. E: Unable to lock the administration directory (/var/lib/dpkg/)
  6. Android之编译jni出错解决办法
  7. 基于DirectShow的流媒体解码和回放
  8. Java虚拟机(十一)——执行引擎
  9. 孙宇晨回顾区块链历程:不走热点走心
  10. 关于pycharm安装出现的interpreter field is empty,无法创建项目存储位置
  11. 待解决的问题 POJ 3225 Help with Intervals 线段树 码力
  12. ggplot做双曲线阈值火山图
  13. 原型设计工具——墨刀
  14. 无源贴片晶振四角引脚_如何区分贴片晶振的脚位方向
  15. frontend -- 框架
  16. Pie-1-南丁格尔玫瑰图-中心带文字
  17. Linux环境下查看日志文件命令详解
  18. 2022-2027年中国蛋白质粉行业市场深度分析及投资战略规划报告
  19. 树莓派+USB摄像头自制网络摄像头
  20. OFD开发系列(一)-添加水印

热门文章

  1. 特征匹配 + 单应性查找对象
  2. iMeta宏基因组生物信息期刊-创刊背景和简介
  3. cover-letter
  4. 程序员小抄 (转载自酷壳,一个专注技术的博客)
  5. 易生信九天的转录组分析培训班总结
  6. img写入工具_硬盘有坏道,得用靠谱的修复工具,这3个不会让你失望
  7. USACO详细介绍 全球中小学生均可参加
  8. tdbgrid 数据类型输入错误 vb_VB语言基础(上)
  9. dedecms 系统迁移及问题
  10. Java高级语法笔记-匿名类(Anonymous Class)