【Sleep、SleepEx】Sleep和 SleepEx函數

【轉自:http://blog.sina.com.cn/s/blog_4c0cb1c001019amf.html】
Sleep和 SleepEx函數的功能是在指定的執行時間內中止所在線程的執行。
SleepEx擴展了Sleep的功能,在最短超時時間間隔已到的情況下恢復線程執行外,在以下兩種情況下發生時也可以恢復執行:I/O完成回調函數被調用、異步過程調用(APC)被安排進入線程中。


Sleep函數原型:
VOID WINAPI Sleep(
    DWORD dwMillseconds);

dwMilliseconds: 指定線程掛起最短時間間隔,以ms爲單位。如設爲常數INFINITE,表示將一個線程永久性的催眠
返回值:無。

SleepEx函數原型:
DWORD WINAPI SleepEx(
    DWORD dwMillesconds,
    BOOL bAlertable);
參數:
dwMilliseconds: 指定線程掛起最短時間間隔,以ms爲單位,時間一到不管後面參數如何都會返回,如設爲常數INFINITE,表示將一個線程永久性的催眠
bAlertable: 設置爲FALSE,那麼,在線程掛起期間不會響應。即使一個I/O完成回調函數被調用或有新的APC排進入,他們使函數返回,也不會被執行。//若是 True, 只要有 APC 函數申請, SleepEx 不管第一個參數如何都會把 APC 推入隊列並隨 APC 函數一起返回.//注意: SetWaitableTimer 和 SleepEx 必須在同一個線程纔可以.
如用一個ReadFileEx   或   WriteFileEx函數調用初始化了一個異步I/O傳輸,而且我們希望函數返回,以便由那些函數指定的I/O結束例程能正常執行,就設爲TRUE。

返回值:
 Long。返回0表示時間間隔完成,返回WAIT_IO_COMPLETION表示I/O完成回調函數被調用。

APC是內核的一種軟中斷性質的東西,後面那個參數應該是這個意思,如果是false,就算有APC被插入,也要等到等待的時間到了,SleepEX才退出,如果是false,那只要有新的APC被插入了,SleepEx就馬上返回了。 其實Windows的內核中Sleep就簡單地理解就是線程掛在那裏多少時間,不對這個線程調度。CPU的時間片都分配到其他線程中,除非等待時間到了,再繼續調度和分配時間片。APC就相當於一個額外的調度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章