Windows CreateEvent函數在多線程中使用及實例

HANDLE CreateEvent(
	LPSECURITY_ATTRIBUTES lpEventAttributes,
	BOOL bManualReset, 
	BOOL bInitialState,
	LPCSTR lpName
);

lpEventAttributes:指向SECURITY_ATTRIBUTES結構體,此結構體決定函數的返回句柄是否可以讓子進程繼承。如果這個參數爲NULL,這個句柄是不能繼承的。一般情況下,這個參數設置爲NULL。

bManualReset:創建一個手動重置事件(TRUE),還是創建一個自動重置事件(FALSE)。

手動置位事件相當於教室門,教室門一旦打開(被觸發),所以有人都可以進入直到老師去關上教室門(事件變成未觸發)。

自動置位事件就相當於醫院裏拍X光的房間門,門打開後只能進入一個人,這個人進去後會將門關上,其它人不能進入除非門重新被打開(事件重新被觸發),即重新使用SetEvent()。

人工重置方式的時候,一旦內核對象得到通知,所有等待該內核對象的線程都變爲可調度線程,等待CPU分配時間,如果程序沒有主動將該內核置爲未通知狀態,則內核對象將一直處於通知狀態,所有等待該內核對象的線程也將一直處於可調度狀態。若要將該內核對象置爲未通知狀態,需要程序主動去做這件事,即主動將內核對象置爲未通知狀態。;

自動重置方式的時候,一旦內核對象變爲通知狀態,則所有等待該內核對象的線程只有一個線程變爲可調度線程,等待CPU分配執行時間,然後該內核對象有馬上自動重置成未通知狀態。WaitForSingleObject()返回。

bInitialState:初始狀態。如果爲TRUE,初始狀態爲有信號;如果爲FALSE,初始狀態爲無信號。hEvent有信號,處於觸發狀態,無信號則爲未觸發狀態。
 

使用此對象實現進程間同步:

  • 在CreateEvent函數中,lpEventAttributes參數指定句柄可被繼承時,通過CreateProcess函數創建的子進程繼承的事件對象句柄。
  • 一個進程可以在DuplicateHandle函數中指定事件對象句柄,從而獲得一個複製的句柄,此句柄可以被其它進程使用。
  • 一個進程可以在OpenEvent或CreateEvent函數中指定一個名字,從而獲得一個有名的事件對象句柄。(在調用OpenEvent或CreateEvent函數時,一個進程可以指定事件對象的名字。)
  • 使用CloseHandle函數關閉句柄。當進程終止時,系統將自動關閉句柄。事件對象會被銷燬,當最後一個句柄被關閉。

WaitForSingleObject

用來檢測hHandle事件的信號狀態,在某一線程中調用該函數時,線程暫時掛起,如果在掛起的dwMilliseconds毫秒內,線程所等待的對象變爲有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函數照樣返回。

SetEvent
函數功能:觸發事件
函數原型:BOOLSetEvent(HANDLEhEvent);
函數說明:每次觸發後,必有一個或多個處於等待狀態下的線程變成可調度狀態。

ResetEvent
函數功能:將事件設爲末觸發
函數原型:BOOLResetEvent(HANDLEhEvent);

由於事件是內核對象,因此使用CloseHandle(Event)就可以完成清理與銷燬了

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章