Windows线程同步之事件(Event)

windows线程同步之事件对象(Event)

  1. 设置为有信号状态SetEvent()

  2. 设置为无信号状态ResetEvent()   

  3. 发送信号脉冲PulseEvent()

  4. 打开已存在的命名对象OpenEvent()

  5. 关闭事件对象CloseEvent()

  6. 等待信号为有信号或超时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表示发 
       生错误。

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值