1. 程式人生 > >Windows 多執行緒之 掛起執行緒(Suspend)和重新啟用(Resume)

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,會發現自己的執行緒函式不會被執行,因為還是被掛起狀態。請合理運用該功能。