Windows 多線程之 掛起線程(Suspend)和重新激活(Resume)

首先來一下原型展示:

DWORD SuspendThread(HANDLE hThread);  

DWORD ResumeThread(HANDLE hThread);  

只要傳入想要掛起的線程句柄就可以了。

原理:在CreateThread的時候,線程覈對象(Thread kernel object)會生成一個表徵線程掛起狀態的值“suspend count”,一開始初始化爲1(因爲線程剛創建的時候要進行一些初始化工作,如我在“終止線程”中所說的)這個時候該線程處於掛起狀態,處於不可調度狀態,當初始化工作結束之後,“suspend count”會自動變成0,變爲系統可調度狀態(但是您可以在CreateThread的時候傳入 CREATE_SUSPENDED標誌位,這樣就不會自動變爲可調度狀態)。之後我們可以自己調用SuspenThread來掛起函數。注意 線程可以掛起自己但是不能重新激活(resume)。resume成功的話會返回線程先前的suspend count,失敗返回0xFFFFFFFF。

代碼:

#include <Windows.h>
#include <iostream>
using namespace std;
DWORD WINAPI FirstThread(PVOID pvParam){
*(int*)pvParam=5;
cout<<"enter my function"<<endl;
ExitThread(1);
return(0);
}
int main(){
int x;
DWORD dwThreadId;
HANDLE hThread=CreateThread(NULL,0,FirstThread,&x,0,&dwThreadId);
//cout<<ResumeThread(hThread)<<endl;
//Sleep(500);
cout<<x<<endl;
SuspendThread(hThread);
SuspendThread(hThread);
//Sleep(500);
cout<<ResumeThread(hThread)<<endl;
cout<<ResumeThread(hThread)<<endl;
CloseHandle(hThread);


system("pause");
return 0;

}

程序運行結果如下:


從中可以看出suspend和resume是可以嵌套的。讀者可以試着去掉一個resume,會發現自己的線程函數不會被執行,因爲還是被掛起狀態。請合理運用該功能。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章