深刻分析Sleep(0)與Sleep(1)的區別

(本文轉載自:  http://www.cppblog.com/kesalin/archive/2012/10/11/sleep.html  )html

目的:
有時候咱們想讓線程不被調度必定的時間,也就是說讓線程睡眠一段時間。ide

 


API 接口:spa

在 Win32中能夠調用 Sleep,SleepEx 和 SwitchToThread 三個API。操作系統

VOID WINAPI Sleep(DWORD dwMilliseconds);線程

DWORD WINAPI SleepEx(DWORD dwMilliseconds, BOOl bAlertable);orm

BOOl WINAPI SwitchToThread();htm


在託管代碼中,咱們能夠調用靜態方法 Thread.Sleep。blog


分析:接口

Sleep 接口均帶有表示睡眠時間長度的參數 timeout。調用以上提到的 Sleep 接口,會有條件地將調用線程從當前處理器上移除,而且有可能將它從線程調度器的可運行隊列中移除。這個條件取決於調用 Sleep 時timeout 參數。隊列


當 timeout = 0, 即 Sleep(0),若是線程調度器的可運行隊列中有大於或等於當前線程優先級的就緒線程存在,操做系統會將當前線程從處理器上移除,調度其餘優先級高的就緒線程運行;若是可運行隊列中的沒有就緒線程或全部就緒線程的優先級均低於當前線程優先級,那麼當前線程會繼續執行,就像沒有調用 Sleep(0)同樣。


當 timeout > 0 時,如:Sleep(1),會引起線程上下文切換:調用線程會從線程調度器的可運行隊列中被移除一段時間,這個時間段約等於 timeout 所指定的時間長度。爲何說約等於呢?是由於睡眠時間單位爲毫秒,這與系統的時間精度有關。一般狀況下,系統的時間精度爲 10 ms,那麼指定任意少於 10 ms但大於 0 ms 的睡眠時間,均會向上求值爲 10 ms。

而調用 SwitchToThread() 方法,若是當前有其餘就緒線程在線程調度器的可運行隊列中,始終會讓出一個時間切片給這些就緒線程,而無論就緒線程的優先級的高低與否。

結論:
由上面的分析能夠看出,若是咱們想讓當前線程真正睡眠一會兒,最好是調用 Sleep(1) 或 SwitchToThread()

相關文章
相關標籤/搜索