您的位置:首页 > 其它

Windows 多线程之 挂起线程(Suspend)和重新激活(Resume)

2014-05-12 09:27 856 查看
首先来一下原型展示:

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,会发现自己的线程函数不会被执行,因为还是被挂起状态。请合理运用该功能。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: