线程
线程的概念:
进程是操作系统分配资源的单位,线程是执行任务的单元。一个进程至少有一个线程。线程还可以创建线程,不过每一个线程都是独立酌执行单元,相互之间没有从属关系。
创建线程最核心要素:
线程执行的起始地址
进程中有什么呢?
创建一个一直存在的进程来分析一下。
这其中首先包括着一个独立的虚拟的4G的内存空间,在这部分空间中存在着我们需要的各种资源,例如:变量、代码、线程。
代码是由线程
跑起来的,如果没有线程的话代码不会被运行,进程也不会存在,所以一个进程至少要有一个线程存在用来执行代码。
线程状态
线程有激发态(有信号状态)
和非激发态(无信号状态)
之分,正在运行的线程处于非激发态,线程结束就会处于激发态。
WaitForSingle0bject就是等待线程处于激发态。
线程暂停次数:
线程是有暂停次数的,一个线程被暂停了多少次在内核对象中是有记录的。
没暂停一次线程,暂停数就会加1,每恢复一次就会自减,只有暂停数为0的时候,线程才会运行起来。
通过API遍历暂停线程
#include<Windows.h>
#include<iostream>
#include<Tlhelp32.h>
DWORD WINAPI ThreadProc(LPVOID lpParameter)
{
while (1) {
printf("你好吗?\n");
}
return 0;
}
int main()
{
//HANDLE hThread = CreateThread(
// NULL,//安全标识符
// NULL,//栈空间大小
// ThreadProc,//回调函数
// 0,//回调函数的参数
// 0,//创建完立马执行
// NULL
//);
Sleep(5000);
//WaitForSingleObject(hThread,-1);//等待线程处于激发态
HANDLE hThreadList = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);//获取所有线程的快照句柄
THREADENTRY32 threadInfo{ sizeof(threadInfo)};
BOOL isSucess = Thread32First(hThreadList,&threadInfo);
if (isSucess)
{
do {
if (threadInfo.th32OwnerProcessID == 14864)
{
printf("线程ID:%d\n", threadInfo.th32ThreadID);
HANDLE hThreadHandle = OpenThread(THREAD_ALL_ACCESS,NULL,threadInfo.th32ThreadID);
SuspendThread(hThreadHandle);//暂停线程
}
} while (Thread32Next(hThreadList, &threadInfo));
}
return 0;//主线程退出时调用exit process退出进程 其他子线程也关闭
}
我们通过遍历线程来测试线程号为14864的API
画图此时可正常运行
当我们运行程序后,发现画图已经无法打开了。
后来运行这个程序,运行成功发现可以正常打开画图。
线程优先级:
每个线程都被赋予了0-31的优先级
当一个线程的时间片耗完,系统该确定给哪个线程分配时间片的时候,会依次从高到低的查看线程优先级,高优先级的线程会被先执行。
当一个低优先级的线程在运行,假如有高优先级的线程准备执行,那么会挂起低优先级的线程,直接给高优先级分配时间片,运行高优先级线程。