線程調(diào)度

線程內(nèi)核對(duì)象中有個(gè)叫做掛起計(jì)數(shù)的東西
每次調(diào)用CreateProcess或者CreateThread時(shí)
這個(gè)東西就會(huì)在線程內(nèi)核對(duì)象創(chuàng)建后初始化為1
然后在線程初始化完成前 就不會(huì)被調(diào)度了
然后在初始化之后 CreateProcess和CreateThread會(huì)檢查有沒(méi)有CREATE_SUSPENDED標(biāo)志傳入
有的話函數(shù)就會(huì)將這個(gè)線程掛起 沒(méi)有則掛起計(jì)數(shù)會(huì)變0
然后線程就可以被調(diào)度了
對(duì)于處于掛起狀態(tài)的線程 我們可以在線程執(zhí)行任何代碼前改變它的環(huán)境(如優(yōu)先級(jí))


然后就是把線程變成可調(diào)度的的方法:
調(diào)用ResumeThread函數(shù) 傳入線程句柄
成功將返回線程的前一個(gè)掛起計(jì)數(shù) 失敗則返回0xFFFFFFFF
一個(gè)線程可以多次掛起 掛起多少次就要Resume多少次才能調(diào)度
DWORD ResumeThread(HANDLE hThread);

另外還可以通過(guò)SuspendThread函數(shù)來(lái)掛起線程
DWORD SuspendThread(HANDLE hThread);
這個(gè)函數(shù)的返回值和ResumeThread相同
(一個(gè)線程最多可以掛起MAXIMUM_SUSPEND_COUNT次[WinNT.h中定義為127])


進(jìn)程的掛起和恢復(fù)(并不存在的概念)

這是一個(gè)掛起進(jìn)程中所有線程的問(wèn)題
雖然沒(méi)有現(xiàn)成的比較好的函數(shù)
但是我們可以自己寫(xiě)一個(gè)

VOID SuspendProcess(DWORD dwProcessID, BOOL fSuspend) {
    HANDLE hThreadSnapShot = INVALID_HANDLE_VALUE;
    THREADENTRY32 te32 = {sizeof(te32)};
    hThreadSnapShot = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, dwProcessID);
    if (hThreadSnapShot != INVALID_HANDLE_VALUE) {
        Thread32First(hThreadSnapShot, &te32);
        do {
            if (te32.th32OwnerProcessID == dwProcessID) {
                HANDLE hThread = OpenThread(THREAD_SUSPEND_RESUME, FALSE, te32.th32ThreadID);
                if (hThread != NULL) {
                    if (fSuspend) {
                        SuspendThread(hThread);
                    }else{
                        ResumeThread(hThread);
                    }
                }
                CloseHandle(hThread);
            }
        }while (Thread32Next(hThreadSnapShot, &te32));
        CloseHandle(hThreadSnapShot);
    }
}  

線程還可以干一件叫做睡眠的事情 大概就是一段時(shí)間內(nèi)不接受調(diào)度的(傲嬌)行為
VOID Sleep(DWORD dwMilliseconds);
具體作用就是會(huì)停止dwMilliseconds ms的時(shí)間
如果傳入0的話 其實(shí)就是強(qiáng)制系統(tǒng)去調(diào)用另外一個(gè)線程(然后這個(gè)線程還可以調(diào)度 嗯標(biāo)準(zhǔn)傲嬌)


切換到另一個(gè)線程的方法:
使用函數(shù)SwitchToThread()
這是一個(gè)并沒(méi)有參數(shù)的函數(shù)
所以有必要解釋一下調(diào)用時(shí)會(huì)發(fā)生什么:
首先系統(tǒng)會(huì)查看是否存在急需CPU時(shí)間的饑餓進(jìn)程

  • 沒(méi)有:立即返回
  • 有:調(diào)度這個(gè)線程

那么這個(gè)函數(shù)和Sleep(0)的作用的區(qū)別在哪兒呢= =
答案是 Sleep(0)之后系統(tǒng)會(huì)運(yùn)行優(yōu)先級(jí)最高的線程
SwitchToThread允許運(yùn)行優(yōu)先級(jí)比自己低的線程


有時(shí)候需要計(jì)算線程運(yùn)行的時(shí)間
一般的做法(誤):

ULONGLONG qwStartTime = GetTickCount64();
...(somethings needed to do)
ULONGLONG qwElapsedTime = GetTickCount64() - qwStartTime;  

這樣做表面看并沒(méi)有問(wèn)題 但問(wèn)題是windows是個(gè)搶占式的系統(tǒng)
所以析显。贱迟。就會(huì)坑
于是你需要使用

BOOL GetThreadTimes (
  HANDLE hThread,
  LPFILETIME lpCreationTime,
  LPFILETIME lpExitTime,
  LPFILETIME lpKernelTime,
  LPFILETIME lpUserTime
);
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末认轨,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌疙教,老刑警劉巖器紧,帶你破解...
    沈念sama閱讀 218,284評(píng)論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異自脯,居然都是意外死亡亡容,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門(mén)冤今,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)闺兢,“玉大人,你說(shuō)我怎么就攤上這事戏罢∥萏罚” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 164,614評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵龟糕,是天一觀的道長(zhǎng)桐磁。 經(jīng)常有香客問(wèn)我,道長(zhǎng)讲岁,這世上最難降的妖魔是什么我擂? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,671評(píng)論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮缓艳,結(jié)果婚禮上校摩,老公的妹妹穿的比我還像新娘。我一直安慰自己阶淘,他們只是感情好衙吩,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,699評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著溪窒,像睡著了一般坤塞。 火紅的嫁衣襯著肌膚如雪冯勉。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,562評(píng)論 1 305
  • 那天摹芙,我揣著相機(jī)與錄音灼狰,去河邊找鬼。 笑死浮禾,一個(gè)胖子當(dāng)著我的面吹牛伏嗜,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播伐厌,決...
    沈念sama閱讀 40,309評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼承绸,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了挣轨?” 一聲冷哼從身側(cè)響起军熏,我...
    開(kāi)封第一講書(shū)人閱讀 39,223評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎卷扮,沒(méi)想到半個(gè)月后荡澎,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡晤锹,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,859評(píng)論 3 336
  • 正文 我和宋清朗相戀三年摩幔,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鞭铆。...
    茶點(diǎn)故事閱讀 39,981評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡或衡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出车遂,到底是詐尸還是另有隱情封断,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評(píng)論 5 347
  • 正文 年R本政府宣布舶担,位于F島的核電站坡疼,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏衣陶。R本人自食惡果不足惜柄瑰,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,310評(píng)論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剪况。 院中可真熱鬧教沾,春花似錦、人聲如沸拯欧。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,904評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)镐作。三九已至藏姐,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間该贾,已是汗流浹背羔杨。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,023評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留杨蛋,地道東北人兜材。 一個(gè)月前我還...
    沈念sama閱讀 48,146評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像逞力,于是被迫代替她去往敵國(guó)和親曙寡。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,933評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容