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