event是内核对象,用来实现线程(进程)之间同步,也可以用于线程(进程)间互斥.:
内核对象:Windows操作系统使用内核对象来管理进程、线程、文件等诸多种类的大量资源。内核对象的创建通常是通过Windows API,比如CreateThread将创建一个线程内核对象,并返回一个内核对象句柄。内核对象实际上是一小块内存,其中包括了引用计数、安全性描述等信息,操作系统通过这一小段内存来管理对应的内核资源。内核对象的实际内存地址并非句柄所展示的,它们在进程内的内核对象句柄表中有映射。
内核对象普遍存在两种状态,要么是触发,要么是未触发。每种内核对象在这两个状态间切换过程都有其特殊的特点,比如进程内核对象在创建的时候总是处于未触发状态,当进程终止时,会变成触发状态;而且进程内核对象永远不会从触发态变回未触发态。于是,如果我们的线程需要等待子进程终止时才继续,那么可以将线程进入等待状态,当子进程标识的进程内核对象变成触发状态的时候唤醒线程!我们所需要的仅仅是Windows为我们提供的等待函数。
event的使用:
bManualReset:手动重置(TRUE),还是自动重置(FALSE).若为自动充值, 则对该事件调用 WaitForSingleObject() 后会自动调用 ResetEvent() 使事件变成未触发状态。
bInitialState:初始状态为触发(TRUE)还是非触发(FALSE)
lpName:用于共享内核对象的机制,这里与线程同步无关,不再阐述,传入NULL即可。
内核对象: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即可。
返回值:事件对象的句柄