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。可能是多线程搞得太少的原因吧。加油了。继续看。恩。