Sleep函數的真正用意


轉自:http://blog.csdn.net/boyuejiang/article/details/8908333

 

關於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的線程重新調度。如果不存在多個擁有相同優先級的可調度線程。就會出現這種情況。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM