2010-11-17 31 views
7

當等待超時時間爲零的事件時,WaitForSingleObject(或WaitForMultipleObjects)會導致上下文切換嗎? (Sleep(0)將立即產生一個線程時間片據我所知。)WaitForSingleObject在超時時間爲零時會導致上下文切換嗎?

現在,關於WaitForSingle|MultipleObject和事件句柄。如果WaitFor * Object實際上需要等待,它顯然會產生其餘的時間片。然而,有兩種情況下,此API 需要等待:

  • 無論是事件信號,在這種情況下,它可以與WAIT_OBJECT_0
  • 或者事件的狀態並不重要返回我指定的零,鑑於這一等待時間,在這種情況下,它可以立即返回,要麼WAIT_OBJECT_0WAIT_TIMEOUT

現在,將WaitForSingleObject導致線程上下文切換,如果提供了零超時時間?

回答

4

基於Windows Research Kernel和一些簡單的逆向工程KeWaitForSingleObject,答案是no。查看WRK,在調用KiSwapThread之前檢查內部定時器的到期時間,確保函數在沒有信號發送時立即返回。

3

現在看來我有種找到了答案,而寫了這個問題 - 這就是我假設從可用文檔

MSDN狀態如下:

dwMilliseconds [在]

超時間隔,以毫秒爲單位。如果指定了非零值 ,則函數會等待,直到 指定的對象被髮送信號,或者 經過該時間間隔。 如果 dwMilliseconds爲零,如果沒有指定 指定對象,函數 不會進入等待狀態;它 總是立即返回。如果 dwMilliseconds是INFINITE,則 函數將僅在指定對象被髮信號時返回。

如果對象信號,我會解釋「不進入等待狀態」爲「無上下文切換髮生了,我想借此暗示它不進入等待狀態」。

相關問題