WaitForSingleObject(四)

 Windows提供了許多內核對象來實現線程的同步。對於線程同步而言,這些內核對象有兩個非常重要的狀態:“已通知”狀態,“未通知”狀態(也有翻譯爲:受信狀態,未受信狀態)。Windows提供了幾種內核對象可以處於已通知狀態和未通知狀態:進程、線程、作業、文件、控制檯輸入/輸出/錯誤流、事件、等待定時器、信號量、互斥對象。

  可以通知一個內核對象,使之處於“已通知狀態”,然後讓其他等待在該內核對象上的線程繼續執行。你可以使用Windows提供的API函數,等待函數來等待某一個或某些內核對象變爲已通知狀態。

1.函數原型:

DWORD WaitForSingleObject(
HANDLE hObject, //指明一個內核對象的句柄
DWORD dwMilliseconds); //等待時間
  • 參數

hObject [in]對象句柄。可以指定一系列的對象,如Event、Job、Memory resource notification、Mutex、Process、Semaphore、Thread、Waitable timer等。

dwMilliseconds[in]定時時間間隔,單位爲milliseconds(毫秒).如果指定一個非零值,函數處於等待狀態直到hHandle標記的對象被觸發,或者時間到了。如果dwMilliseconds爲0,對象沒有被觸發信號,函數不會進入一個等待狀態,它總是立即返回。如果dwMilliseconds爲INFINITE(一直等到,直到等到),對象被觸發信號後,函數纔會返回。

  • 返回值

執行成功,返回值指示出引發函數返回的事件。它可能爲以下值:

WAIT_ABANDONED0x00000080L

The specified object is a mutex object that was not released by the thread that owned the mutex object before the owning thread terminated. Ownership of the mutex object is granted to the calling thread and the mutex state is set to nonsignaled.

If the mutex was protecting persistent state information, you should check it for consistency.

WAIT_OBJECT_00x00000000L

The state of the specified object is signaled.

WAIT_TIMEOUT0x00000102L

The time-out interval elapsed, and the object's state is nonsignaled.

WAIT_FAILED(DWORD)0xFFFFFFFF

The function has failed. To get extended error information, callGetLastError.

WaitForSingleObject函數用來檢測hHandle事件的信號狀態,在某一線程中調用該函數時,線程暫時掛起,如果在掛起的dwMilliseconds毫秒內,線程所等待的對象變爲有信號狀態,則該函數立即返回;如果超時時間已經到達dwMilliseconds毫秒,但hHandle所指向的對象還沒有變成有信號狀態,函數照樣返回。參數dwMilliseconds有兩個具有特殊意義的值:0和INFINITE。若爲0,則該函數立即返回;若爲INFINITE,則線程一直被掛起,直到hHandle所指向的對象變爲有信號狀態時爲止。

WAIT_ABANDONED 0x00000080:當hHandle爲mutex時,如果擁有mutex的線程在結束時沒有釋放核心對象會引發此返回值。

WAIT_OBJECT_0 0x00000000 :指定的對象出有信號狀態

WAIT_TIMEOUT 0x00000102:等待超時

WAIT_FAILED 0xFFFFFFFF :出現錯誤,可通過GetLastError得到錯誤代碼

 

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