windows线程同步之事件对象(Event)
-
设置为有信号状态SetEvent()
-
设置为无信号状态ResetEvent()
-
发送信号脉冲PulseEvent()
-
打开已存在的命名对象OpenEvent()
-
关闭事件对象CloseEvent()
-
等待信号为有信号或超时WaitForSingleObject()
创建或打开事件对象CreateEvent()
Event是windows的核心对象之一,不仅可以实现单个进程中的线程之间的同步,还可以实现多个进程中的线程同步。主要通过事件对象的有信号状态和无信号状态的变换来实现。
CreateEvent的作用是windows中创建或打开一个命名或无名的事件对象。
HANDLE WINAPI CreateEvent(
_In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
_In_ BOOL bManualReset,
_In_ BOOL bInitialState,
_In_opt_ LPCTSTR lpName
);
参数一:指向LPSECURITY_ATTRIBUTES结构的指针。如果这个参数为NULL,则这个HANDLE不能被子进程所继承。
参数二:如果这个参数为TRUE则创建一个手动复位的事件对象,需要使用ResetEvent把事件从有信号状态恢复为
无信号状态。如果参数为FALSE,则会创建一个自动复位的事件对象,当信号被一个等待线程释放时,系
统会自动将其从有信号状态复位为无信号状态。
参数三:如果为TRUE,则事件对象初始化为有信号状态,否则为无信号状态。
参数四:事件对象的名字,是一个长度不超过MAX_PATH的字符串,名字对大小写敏感。参数如果与一个已经存在
的事件对象同名,则函数请求EVENT_ALL_ACCSS访问已存在的事件对象,由于第二个和第三个参数已经再
创建事件的进程中被设置,则忽略这两个参数,如果第一个参数不为NULL,则确认其HANDLE是否可以被
继承,但是其成员lpSecurityDescriptor将被忽略。如果第四个参数为空,则创建一个无名事件对象。
如果第四个参数与其它同一空间的其他对象同名,例如semaphone,mutex,job等,则会出错,调用
GetLastError函数会返回ERROR_INVALID_HANDLE,发生错误的原因是他们在同一共享空间。
返回值:成功则返回一个事件对象的句柄,如果对于命名的事件对象,创建之前已存在则返回已存在的对象的句柄,调用GetLastError返回ERROR_ALREADY_EXISTS。如果失败则返回NULL。
CloseHandle函数是关闭打开的对象HANDLE
BOOL CloseHandle(HANDLE hObject);
参数:打开的对象HANDLE
返回值:成功返回非零值,失败返回零值。
SetEvent函数设置CreateEvent创建的事件对象的状态为有信号状态。
BOOL SetEvent(HANDLE hEvent);
参数:CreateEvent返回的事件对象HANDLE。
返回值:成功返回非零值,失败返回零值。
ResetEvent函数设置CreateEvent创建的事件对象的状态为无信号状态
BOOL ResetEvent(HANDLE hEvent);
参数:CreateEvent返回的事件对象的HANDLE。
返回值:成功返回非零值,失败返回零值。
PulseEvent函数发送一个信号脉冲,先把时间对象的状态设置为有信号状态,然后恢复为无信号状态。
BOOL PulseEvent()
返回值:成功返回非零值,失败返回零值。
OpenEvent函数的作用是打开一个已经存在的命名事件对象。
HANDLE OpenEvent(
DWORD dwDesciredAccess,
BOOL bInheritHandle,
LPCTSTR lpName
)
参数一:对事件对象的访问权限,操作系统支持对象安全,如果请求访问的进行没有权限访问事件对象的安全权限则会失败。一般设置为EVENT_ALL_ACCESS。
参数二:事件句柄的继承性。
参数三:访问的事件对象名称,保证不同进程可以访问同一个事件对象。
返回值:被打开的事件HANDL
WaitForSingleObject函数阻塞进程或线程当对象为有信号状态或者超时是返回。
DWORD WaitForSingleObject(
HANDLE hHandle,
DWORD dwMilliseconds
)
参数一:对象HANDLE可以指定一系列的对象。
参数二:设置的等待时间,当时间到达时事件仍为无信号状态,则函数超时返回。如果设置为INFINITE时则会一
直等待直到被触发为有信号状态。
返回值:WAIT_OBJECT_0表示对象被设置为有信号状态。WAIT_TIMEOUT表示等待超时返回。WAIT_FAILED表示发
生错误。