Win32 Thread API学习之Event Objects

 Win32中最具有弹性的同步机制就属events对象了。Event对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态。这两种状态完全由程序来控制,不会成为Wait…()函数的副作用。
Event对象之所以有大用途,正是因为它的状态完全在你掌握之下。Mutexes和Semaphores就不一样了,他们的状态会因为诸如WaitForSingleObject()之类的函数调用而变化。所以,你可以精确告诉一个event对象做什么事情,以及什么时候去做。
Event对象被运用在多种类型的高级I/O操作中。Event对象也可以用来设计你自己的同步对象。
产生一个event对象,可以调用CreateEvent():
CreateEvent
The CreateEvent function creates a named or unnamed event object.
HANDLE CreateEvent(
    LPSECURITY_ATTRIBUTES lpEventAttributes, // pointer to security attributes 
    BOOL bManualReset,                // flag for manual-reset event
    BOOL bInitialState,     // flag for initial state
    LPCTSTR lpName          // pointer to event-object name 
   );
For Example:
hEvent = CreateEvent(NULL,TRUE,FALSE," Event");
其中bManualReset需要特别说明一下:
如为FALSE,表示这个event将在变成激发状态(因而唤醒一个线程)之后,自动重置(reset)为非激发状态。如果是TRUE,表示不会自动重置,必须靠程序操作(调用ResetEvent())才能将激发状态的event重置为非激发状态。
Return Values
 
If the function succeeds, the return value is a handle to the event object. If the named event object existed before the function call, the GetLastError function returns ERROR_ALREADY_EXISTS. Otherwise, GetLastError returns zero.
If the function fails, the return value is NULL.
与Event相关的几个API函数:
SetEvent(),把event对象设为激发状态
ResetEvent(),把event对象设为非激发状态,Reset的意思是“设定为非激发状态”,而不是“重新设定为激发状态”
PulseEvent(),如果是一个Manual Reset Event:把event对象设为激发状态,唤醒 “所有”等待中的线程,然后event恢复为非激发状态。如果是一个Auto Reset Event:把event对象设为激发状态,唤醒 “一个”等待中的线程,然后event恢复为非激发状态
如果是automatic,那event总是处于非激发状态,所以按下ResetEvent不会产生什么效果。但按下SetEvent和PulseEvent会唤醒一个等待中的线程。
如果是manual,event对象可能是激发的,也可能是非激发,视上一次调用的是SetEvent()或ResetEvent()而定。按下SetEvent会使得每一个等待中的线程立刻苏醒。按下PulseEvent会使的目前等待中的所有线程苏醒过来(随后立刻又进入等待状态)。
 
侯杰大叔翻译的书也搞死我了!Sigh。感觉概念很模糊,看得我一头雾水,来来回回看了好几遍了,还不知道自己是不是已经懂了。5555555。可能是多线程搞得太少的原因吧。加油了。继续看。恩。
  <script type=text/javascript> </script><script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type=text/javascript> </script>
Google
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值