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,会发现自己的线程函数不会被执行,因为还是被挂起状态。请合理运用该功能。
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,会发现自己的线程函数不会被执行,因为还是被挂起状态。请合理运用该功能。
相关文章推荐
- JAVA多线程之线程的挂起与恢复(suspend方法与resume方法)
- Java多线程系列——过期的suspend()挂起、resume()继续执行线程
- Java多线程之线程的挂起与恢复(Suspend/Resume)
- 线程安全之suspend(挂起) 和resume(执行)
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
- Java 多线程使用:线程的挂起与重新唤醒
- 重新想象 Windows 8 Store Apps (42) - 多线程之线程池: 延迟执行, 周期执行, 在线程池中找一个线程去执行指定的方法
- Java 多线程使用:线程的挂起与重新唤醒
- 过期的suspend()挂起、resume()继续执行线程
- java线程阻塞(sleep,suspend,resume,yield,wait,notify)
- 从头认识多线程-1.11 suspend和resume缺点-独占
- Java线程中sleep()、wait()和notify()和notifyAll()、suspend和resume()、yield()、join()、interrupt()的用法和区别
- windows 多线程编程 之 线程创建
- 清除Windows 7的OEM证书及相关的Key并重新导入激活
- USB的挂起和唤醒 (Suspend and Resume)
- USB的挂起和唤醒(Suspend and Resume)
- java线程阻塞(sleep,suspend,resume,yield,wait,notify)
- Windows编程--挂起和恢复线程的运行
- 重新想象 Windows 8 Store Apps (46) - 多线程之线程同步: Lock, Monitor, Interlocked, Mutex, ReaderWriterLock
- Java多线程(三)——线程挂起、恢复、终止