【免杀前置课——Windows编程】十一、线程是什么?创建一个线程、进程与线程关系、一个进程中有什么、线程的状态、激发态与非激发态区别、通过API遍历暂停线程(附代码)

线程

线程的概念:
进程是操作系统分配资源的单位,线程是执行任务的单元。一个进程至少有一个线程。线程还可以创建线程,不过每一个线程都是独立酌执行单元,相互之间没有从属关系。
创建线程最核心要素:
线程执行的起始地址
在这里插入图片描述

进程中有什么呢?

创建一个一直存在的进程来分析一下。
在这里插入图片描述

这其中首先包括着一个独立的虚拟的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的优先级
当一个线程的时间片耗完,系统该确定给哪个线程分配时间片的时候,会依次从高到低的查看线程优先级,高优先级的线程会被先执行。
当一个低优先级的线程在运行,假如有高优先级的线程准备执行,那么会挂起低优先级的线程,直接给高优先级分配时间片,运行高优先级线程。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

webfker from 0 to 1

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值