日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

线程的暂停和恢复

發(fā)布時間:2023/12/15 编程问答 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 线程的暂停和恢复 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

線程的暫停計數(shù)

在線程內(nèi)核對象的內(nèi)部有一個值,用于指明線程的暫停計數(shù)。當(dāng)調(diào)用CreateProcessCreateProcess函數(shù)時,就創(chuàng)建了線程的內(nèi)核對象,并且它的暫停計數(shù)被初始化為1。這可以防止線程被調(diào)度到CPU中。當(dāng)然,這是很有用的,因為線程的初始化需要時間,你不希望在系統(tǒng)做好充分的準(zhǔn)備之前就開始執(zhí)行線程。當(dāng)線程完全初始化好了之后CreateProcessCreateThread要查看是否已經(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ù)時返回的線程句柄傳遞給它(或者是將傳遞給CreateProcessppiProcInfo參數(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é)

以上是生活随笔為你收集整理的线程的暂停和恢复的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。