天天看點

Sleep函數的真正用意

關于void sleep(dword dwmilliseconds);函數,許多人都覺得,它是告訴系統,延遲多少毫秒來執行後面的代碼。

但是,在windows這樣的非實時多任務系統中,我們是無法估算會睡眠多久的。因為一個線程不是總是被執行的。它會在執行一段時間後,被系統暫停,然後系統又去執行另外的線程代碼。于是,sleep函數的解釋如下:

當調用sleep函數的時候,比如sleep(400);它告訴系統,此線程将放棄此次運作的時間片,比方說現線上程隻執行了10ms,按“有關部門規定”它被喚醒一次是要執行20ms的。這時它就說,這次機會我放棄,後面的10ms不要了。下次輪上我再叫我。 這樣,系統便會将其終止,然後再一次進行排程選擇。如果它運氣很好,又被選中了,系統則會檢視這個線程是否處于sleep标志中。如果發現他還需要繼續睡眠,則重新進行排程選擇,直到選擇一個有權執行的線程為止。 如果很不幸,400ms到了,但是系統很忙,排程算法在很長一段時間也沒有選擇到這個線程,那這麼線程就很繼續休眠。于是說,這個sleep(400);将導緻這個線程會休眠大于等于400ms的時間。

以前我做程式的時候也用過sleep來作為控制程式執行速度的方法。現在想來,的确很欠考慮。

關于這個函數更具權威的解釋(抄書):

1、調用sleep,可使線程自願放棄它剩餘的時間片。

2、系統将在大約的指定秒數内使線程不可高度。不錯,如果告訴系統,想睡眠100ms,那麼可以睡大約這麼長的時間,但也也可能睡眠數秒或數分鐘。記住,windows不是個實時作業系統。雖然線程可能在規定的時間被喚醒,但是它能否做到,取決于系統中還有什麼操作正在進行。

3、可以調用sleep(infinite),告訴系統永遠不要調用這個線程。但最好不要這樣,讓線程退出就行了。反正你都不再需要它。或者調用sleep(0);告訴系統線程将放棄剩于的時間片,并使系統排程另一個線程。但是,系統可以對剛剛調用sleep的線程重新排程。如果不存在多個擁有相同優先級的可排程線程。就會出現這種情況。

簡介:09年入行,喜歡遊戲和程式設計,對3d遊戲和引擎尤其感興趣。 

版權聲明:本文版權歸作者和部落格園共有,歡迎轉載。轉載必須保留此段聲明,且在文章頁面明顯位置給出原文連接配接,否則保留追究法律責任的權利。

轉載:http://www.cnblogs.com/geniusalex/archive/2010/07/02/1940485.html

繼續閱讀