多线程第四篇:event线程同步

本文详细探讨了多线程编程中的Event事件同步机制,通过实例解析其工作原理,帮助开发者掌握如何利用事件对象进行线程间的协调与通信。
摘要由CSDN通过智能技术生成
event是内核对象,用来实现线程(进程)之间同步,也可以用于线程(进程)间互斥.:
     内核对象:Windows操作系统使用内核对象来管理进程、线程、文件等诸多种类的大量资源。内核对象的创建通常是通过Windows API,比如CreateThread将创建一个线程内核对象,并返回一个内核对象句柄。内核对象实际上是一小块内存,其中包括了引用计数、安全性描述等信息,操作系统通过这一小段内存来管理对应的内核资源。内核对象的实际内存地址并非句柄所展示的,它们在进程内的内核对象句柄表中有映射。
     内核对象普遍存在两种状态,要么是触发,要么是未触发。每种内核对象在这两个状态间切换过程都有其特殊的特点,比如进程内核对象在创建的时候总是处于未触发状态,当进程终止时,会变成触发状态;而且进程内核对象永远不会从触发态变回未触发态。于是,如果我们的线程需要等待子进程终止时才继续,那么可以将线程进入等待状态,当子进程标识的进程内核对象变成触发状态的时候唤醒线程!我们所需要的仅仅是Windows为我们提供的等待函数。

event的使用:
CreateEvent:
HANDLE CreateEvent(
  LPSECURITY_ATTRIBUTES lpEventAttributes,
  BOOL bManualReset,
  BOOL bInitialState,
  LPTSTR lpName
);
lpEventAttributes:会被忽略,必须为NULL(这里是MSDN的说法,在Windows Via C/C++中,暗示了这个参数与内核对象的安全属性和共享特性有关。不过通常都会传入NULL,因为不太会考虑让一个事件对象变为可继承)

bManualReset:手动重置(TRUE),还是自动重置(FALSE).若为自动充值, 则对该事件调用 WaitForSingleObject() 后会自动调用 ResetEvent() 使事件变成未触发状态。

bInitialState:初始状态为触发(TRUE)还是非触发(FALSE)

lpName:用于共享内核对象的机制,这里与线程同步无关,不再阐述,传入NULL即可。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值