Kisser Leon

这个kisser不太冷
posts - 100, comments - 102, trackbacks - 0, articles - 0

Win32 Thread API学习之Event Objects

Posted on 2007-04-03 14:44 kk 阅读(1061) 评论(0)  编辑 收藏 引用 所属分类: IT
 Win32中最具有弹性的同步机制就属events对象了。Event对象是一种核心对象,它的唯一目的就是成为激发状态或未激发状态。这两种状态完全由程序来控制,不会成为Wait…()函数的副作用。

Event对象之所以有大用途,正是因为它的状态完全在你掌握之下。MutexesSemaphores就不一样了,他们的状态会因为诸如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不会产生什么效果。但按下SetEventPulseEvent会唤醒一个等待中的线程。

如果是manualevent对象可能是激发的,也可能是非激发,视上一次调用的是SetEvent()ResetEvent()而定。按下SetEvent会使得每一个等待中的线程立刻苏醒。按下PulseEvent会使的目前等待中的所有线程苏醒过来(随后立刻又进入等待状态)。

 

侯杰大叔翻译的书也搞死我了!Sigh。感觉概念很模糊,看得我一头雾水,来来回回看了好几遍了,还不知道自己是不是已经懂了。5555555。可能是多线程搞得太少的原因吧。加油了。继续看。恩。

Google

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理