Win32
中最具有彈性的同步機(jī)制就屬events
對象了。Event
對象是一種核心對象,它的唯一目的就是成為激發(fā)狀態(tài)或未激發(fā)狀態(tài)。這兩種狀態(tài)完全由程序來控制,不會(huì)成為Wait…()
函數(shù)的副作用。
Event對象之所以有大用途,正是因?yàn)樗臓顟B(tài)完全在你掌握之下。Mutexes和Semaphores就不一樣了,他們的狀態(tài)會(huì)因?yàn)橹T如WaitForSingleObject()之類的函數(shù)調(diào)用而變化。所以,你可以精確告訴一個(gè)event對象做什么事情,以及什么時(shí)候去做。
Event對象被運(yùn)用在多種類型的高級(jí)I/O操作中。Event對象也可以用來設(shè)計(jì)你自己的同步對象。
產(chǎn)生一個(gè)event對象,可以調(diào)用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,表示這個(gè)event將在變成激發(fā)狀態(tài)(因而喚醒一個(gè)線程)之后,自動(dòng)重置(reset)為非激發(fā)狀態(tài)。如果是TRUE,表示不會(huì)自動(dòng)重置,必須靠程序操作(調(diào)用ResetEvent())才能將激發(fā)狀態(tài)的event重置為非激發(fā)狀態(tài)。
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相關(guān)的幾個(gè)API函數(shù):
SetEvent(),把event對象設(shè)為激發(fā)狀態(tài)
ResetEvent(),把event對象設(shè)為非激發(fā)狀態(tài),Reset的意思是“設(shè)定為非激發(fā)狀態(tài)”,而不是“重新設(shè)定為激發(fā)狀態(tài)”
PulseEvent(),如果是一個(gè)Manual Reset Event:把event對象設(shè)為激發(fā)狀態(tài),喚醒“所有”等待中的線程,然后event恢復(fù)為非激發(fā)狀態(tài)。如果是一個(gè)Auto Reset Event:把event對象設(shè)為激發(fā)狀態(tài),喚醒“一個(gè)”等待中的線程,然后event恢復(fù)為非激發(fā)狀態(tài)
如果是automatic,那event總是處于非激發(fā)狀態(tài),所以按下ResetEvent不會(huì)產(chǎn)生什么效果。但按下SetEvent和PulseEvent會(huì)喚醒一個(gè)等待中的線程。
如果是manual,event對象可能是激發(fā)的,也可能是非激發(fā),視上一次調(diào)用的是SetEvent()或ResetEvent()而定。按下SetEvent會(huì)使得每一個(gè)等待中的線程立刻蘇醒。按下PulseEvent會(huì)使的目前等待中的所有線程蘇醒過來(隨后立刻又進(jìn)入等待狀態(tài))。
侯杰大叔翻譯的書也搞死我了!Sigh。感覺概念很模糊,看得我一頭霧水,來來回回看了好幾遍了,還不知道自己是不是已經(jīng)懂了。5555555。可能是多線程搞得太少的原因吧。加油了。繼續(xù)看。恩。