线程的暂停和恢复
線程的暫停計數
在線程內核對象的內部有一個值,用于指明線程的暫停計數。當調用CreateProcess或CreateProcess函數時,就創建了線程的內核對象,并且它的暫停計數被初始化為1。這可以防止線程被調度到CPU中。當然,這是很有用的,因為線程的初始化需要時間,你不希望在系統做好充分的準備之前就開始執行線程。當線程完全初始化好了之后CreateProcess或CreateThread要查看是否已經傳遞了CREATE_SUSPENDED標志。如果已經傳遞了這個標志,那么這些函數就返回,同時新線程處于暫停狀態。如果尚未傳遞該標志,那么該函數將線程的暫停計數遞減為 0。當線程的暫停計數是0的時候,除非線程正在等待其他某種事情的發生,否則該線程就處于可調度狀態。
?
ResumeThread函數
在暫停狀態中創建一個線程,就能夠在線程有機會執行任何代碼之前改變線程的運行環境(如優先級)。一旦改變了線程的環境,必須使線程成為可調度線程。要進行這項操作,可以調用ResumeThread,將調用CreateThread函數時返回的線程句柄傳遞給它(或者是將傳遞給CreateProcess的ppiProcInfo參數指向的線程句柄傳遞給它):如果ResumeThread函數運行成功,它將返回線程的前一個暫停計數,否則返回0xFFFFFFFF。單個線程可以暫停若干次。如果一個線程暫停了3次,它必須恢復3次,然后它才可以被分配給一個CPU。
?
SuspendThread函數
當創建線程時,除了使用 CRETE_SUSPENDED也可以調用SuspendThread函數來暫停線程的運行:任何線程都可以調用該函數來暫停另一個線程的運行(只要擁有線程的句柄)。線程可以自行暫停運行,但是不能自行恢復運行。與ResumeThread一樣SuspendThread返回的是線程的前一個暫停計數。線程暫停的最多次數可以是MAXIMUM_SUSPEND_COUNT次(在WinNT. h中定義為127)。注意,SuspendThread與內核方式的執行是異步進行的,但是在線程恢復運行之前,不會發生用戶方式的執行。在實際環境中,調用SuspendThread時必須小心,因為不知道暫停線程運行時它在進行什么操作。如果線程試圖從堆棧中分配內存,那么該線程將在該堆棧上設置一個鎖。當其他線程試圖訪問該堆棧時,這些線程的訪問就被停止,直到第一個線程恢復運行。
?
系統提供了一個稱為 SwitchToThread的函數,使得另一個可調度線程(如果存在能夠運行):
當調用這個函數的時候,系統要查看是否存在一個迫切需要 CPU時間的線程。如果沒有線程迫切需要CPU時間,SwitchToThread就會立即返回。如果存在一個迫切需要CPU時間的線程,SwitchToThread就對該線程進行調度(該線程的優先級可能低于調用SwitchToThread的線程)。這個迫切需要CPU時間的線程可以運行一個時間段,然后系統調度程序照常運行。該函數允許一個需要資源的線程強制另一個優先級較低、而目前卻擁有該資源的線程放棄該資源。如果調用SwitchToThread函數時沒有其他線程能夠運行,那么該函數返回 FA L S E,否則返回一個非0值。
調用SwitchToThread函數與調用Sleep是相似的,并且傳遞給它一個 0ms的超時。差別是SwitchToThread允許優先級較低的線程運行。即使低優先級線程迫切需要CPU時間,Sleep也能夠立即對調用線程重新進行調度。
轉載于:https://blog.51cto.com/rosehacker/449506
總結
- 上一篇: 问界有伴了!华为、江淮合作最新进展:智能
- 下一篇: 关于本地共享文件夹会话连接时间