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