Event是windows操作系统的一种内核对象,它可以用于进程间同步和线程间同步。
进程间同步的使用
在windows所提供的内核对象中,Event内核对象比其他内核对象,如信号量,互斥量,简单的多。Event只有是否触发的属性。
下面是Event内核对象的函数接口:
(1)CreateEvent() 创建事件
HANDLE WINAPI CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
lpEventAttributes: 安全属性,一般置为NULL;
bManualReset: 是手动重置事件(TRUE) ,自动重置事件(FALSE);
bInitialState: 初始状态:触发状态(TRUE)还是非触发状态(FALSE);
lpName: 创建 事件对象的名字,用于进程间的共享;
如果该事件对象已经存在,那么CreateEvent会返回该内核对象的句柄,并通过系统返回错误ERROR_ALREADY_EXISTS,可以通过GetLastError()获得该错误号。
(2)OpenEvent() 打开一个事件内核对象
HANDLE WINAPI OpenEvent(
_In_ DWORD dwDesiredAccess,
_In_ BOOL bInheritHandle,
_In_ LPCTSTR lpName
);
dwDesiredAccess:指定想要的访问权限,EVENT_ALL_ACCESS请求对事件对象的完全访问,
EVENT_MODIFY_STATE允许使用SetEvent,,ResetEvent和PulseEvent函数;
bInheritHandle:是否希望子进程继承事件对象的句柄,一般设置为false;
lpName:要打开的事件对象的名称;
其他进程中的线程可以通过OpenEvent或CreateEvent访问已经存在的事件内核对象。和其他内核对象的访问一样。
(3)WaitForSingleObject() 等待函数
DWORD WINAPI WaitForSingleObject(
_In_ HANDLE hHandle,
_In_ DWORD dwMilliseconds
);
hHandle:指向内核对象的句柄;
dwMilliseconds:线程最大等待多长时间,直到该对象被触发。经常使用INFINITE,表示阻塞等待。
WaitForSingleObject被称呼为等待函数,是等待内核对象被触发通用的等待函数,它被用在所有的内核对象触发等待中。当事件对象处于未触发状态,等待函数会被阻塞。当处于触发状态时,等待函数会被系统调用,成功返回。当等待函数返回后,该事件对象的状态是被重置为未触发状态还是仍然处于触发状态,由该事件对象是自动重置还是手动重置事件决定。当该事件对象是自动重置事件时,在等待函数返回时,该事件会自动变成未触发状态,如果事件对象为手动重置事件,那么等待函数返回后,该事件仍然处于触发状态,