【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就相當於一個額外的調度。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.