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
發佈了187 篇原創文章 · 獲贊 0 · 訪問量 22萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章