WIN32核心编程 - 线程操作(一) 线程信息 - 线程控制

  • 公开视频 -> 链接点击跳转公开课程
  • 博客首页 -> 链接点击跳转博客主页

目录

Thread

Thread Control

创建 - Create

 执行 - Execute

挂起 - Suspend

恢复 - Resume

终止 - Terminate

 远程 - Remote

Thread Info

GetCurrentThread/Id

GetThreadContext

CreateToolhelp32Snapshot


Thread

  • 什么是线程?

    • 线程是CPU进行调度的最小单位,它被包含在进程中。

    • 一个进程可以并发多条线程,每条线程分别执行不同的任务。

    • 每条线程都拥有自己的一套寄存器以及堆栈信息,并且线程可以同时共享同一进程中的数据以及代码资源。

  • 线程与进程的关系?

    • 进程

      • 拥有独立的内存空间。

      • 拥有独立的执行环境。

      • 进程间通信需要特殊机制。

    • 线程

      • 线程是进程的一部分,共享相同的内存空间。

      • 每条线程都有自己独立的执行环境。

      • 线程间可以直接读写进程中的数据资源等。

    • 关系

      • 进程是操作系统进程资源分配以及调度的基本单位。

      • 线程作为进程的一部分,是进程内部的执行单位,一个进程至少包含一个线程,即主线程。

Thread Control

创建 - Create
  • 线程是通过CreateThread来创建的,该API会为线程分配必要的资源并返回一个内核对象句柄。

  • 创建线程是可以通过参数指定线程的属性,线程运行状态(创建运行线程 、创建挂起线程),以及堆栈大小。

  • CreateThread

  • WaitForSingleObject

#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (dwCount <= 10){std::cout << " WorkThread " << dwCount++ << std::endl;Sleep(1000);}std::cout << "WorkThread Exit" << std::endl;return 0;
}int main()
{DWORD dwTid = 0;HANDLE hThread = CreateThread(NULL,0,WorkThread,NULL,0,&dwTid);if (hThread == NULL) return 0;DWORD dwTime = WaitForSingleObject(hThread, INFINITE);std::cout << dwTime << std::endl;return 0;
}#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (dwCount <= 10){std::cout << " WorkThread " << (DWORD)lp << "\t" << dwCount++ << std::endl;Sleep(1000);}std::cout << "WorkThread " << (DWORD)lp << "\t" << " Exit " << std::endl;return 0;
}int main()
{HANDLE hThread[3] = { 0 };hThread[0] = CreateThread(NULL, 0, WorkThread, (LPVOID)1, 0, NULL);hThread[1] = CreateThread(NULL, 0, WorkThread, (LPVOID)2, 0, NULL);hThread[2] = CreateThread(NULL, 0, WorkThread, (LPVOID)3, 0, NULL);DWORD dwTime = WaitForMultipleObjects(3, hThread, TRUE, -1);return 0;
}
 执行 - Execute
  • 使用CreateThread创建线程时,当参数不指定CREATE_SUSPENDED时,线程会进去就绪等待调度。

  • 指定CREATE_SUSPENDED时,线程会进入挂起状态,需要使用ResumeThread恢复线程运行状态。

#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{while (1){std::cout << "WorkThread" << std::endl;Sleep(1000);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, CREATE_SUSPENDED, NULL);system("pause");ResumeThread(hThread);system("pause");return 0;
}
挂起 - Suspend
  • SuspendThread
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (1){std::cout << dwCount++ << std::endl;Sleep(500);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;system("pause");SuspendThread(hThread);system("pause");ResumeThread(hThread);system("pause");return 0;
}
恢复 - Resume
  • ResumeThread
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (1){std::cout << dwCount++ << std::endl;Sleep(500);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;system("pause");SuspendThread(hThread);system("pause");ResumeThread(hThread);system("pause");return 0;
}
终止 - Terminate
  • TerminateThread
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{while (1){std::cout << "WorkThread" << std::endl;Sleep(500);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;system("pause");TerminateThread(hThread, 3);WaitForSingleObject(hThread, -1);//0x103 == ACTIVEDWORD dwCode = -1;GetExitCodeThread(hThread, &dwCode);system("pause");CloseHandle(hThread);return 0;
}
  • ExitThread
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{DWORD dwCount = 0;while (1){std::cout << "WorkThread" << std::endl;Sleep(500);if (dwCount++ >= 5){ExitThread(5);}}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;WaitForSingleObject(hThread, -1);DWORD dwCode = 0;GetExitCodeThread(hThread, &dwCode);CloseHandle(hThread);return 0;
}
 远程 - Remote
#include <iostream>
#include <Windows.h>int main()
{HANDLE hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, 67780);if (hProcess == INVALID_HANDLE_VALUE) return 0;HANDLE hThread = CreateRemoteThread(hProcess,NULL,0,(LPTHREAD_START_ROUTINE)0x487085,NULL,0,NULL);if (hThread == NULL) return 0;WaitForSingleObject(hThread, -1);CloseHandle(hProcess);CloseHandle(hThread);/*VirtualAllocEx		 Addr		68 C4 08 01 00       push        108C4h6A 00                push        068 FF FF 1F 00       push        1FFFFFhFF 15 0C A0 51 00    call        dword ptr [__imp__OpenProcess@12 (051A00Ch)]C3					 ret*/return 0;
}

Thread Info

GetCurrentThread/Id
#include <iostream>
#include <Windows.h>int main()
{printf("Process Handle -> 0x%08x \r\n", GetCurrentProcess());printf("Thread  Handle -> 0x%08x \r\n", GetCurrentThread());printf("Process Id	   -> 0x%08x \r\n", GetCurrentProcessId());printf("Thread  Id	   -> 0x%08x \r\n", GetCurrentThreadId());printf("Thread  Id	   -> 0x%08x \r\n", GetProcessId(GetCurrentProcess()));printf("Thread  Id	   -> 0x%08x \r\n", GetThreadId(GetCurrentThread()));return 0;
}
GetThreadContext
#include <iostream>
#include <Windows.h>DWORD WINAPI WorkThread(LPVOID lp)
{std::cout << "WorkThread " << (DWORD)lp << std::endl;while (true){Sleep(1000);}return 0;
}int main()
{HANDLE hThread = CreateThread(NULL, 0, WorkThread, NULL, 0, NULL);if (hThread == NULL) return 0;Sleep(3000);SuspendThread(hThread);CONTEXT context = { 0 };context.ContextFlags = CONTEXT_ALL;GetThreadContext(hThread, &context);ResumeThread(hThread);return 0;
}
CreateToolhelp32Snapshot
#include <iostream>
#include <Windows.h>
#include <TlHelp32.h>int main()
{HANDLE hSnapProcess = NULL;HANDLE hSnapThread = NULL;PROCESSENTRY32 pe32 = { 0 };pe32.dwSize = sizeof(pe32);THREADENTRY32 te32 = { 0 };te32.dwSize = sizeof(te32);// 系统进程快照hSnapProcess = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);if (hSnapProcess == INVALID_HANDLE_VALUE) return 0;// 遍历系统进程if (Process32First(hSnapProcess, &pe32)){do{// 获取进程标识std::cout << "Process Id -> " << pe32.th32ProcessID << std::endl;// 系统线程快照hSnapThread = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);if (hSnapThread == INVALID_HANDLE_VALUE) return 0;// 遍历系统线程if (Thread32First(hSnapThread, &te32)){do{// 比较线程进程if (te32.th32OwnerProcessID == pe32.th32ProcessID){std::cout << "\t" << "Thread Id -> " << te32.th32ThreadID << std::endl;}} while (Thread32Next(hSnapThread, &te32));}CloseHandle(hSnapThread);} while (Process32Next(hSnapProcess, &pe32));}CloseHandle(hSnapProcess);return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1473992.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

第二次练习

目录 一、student表的增删改查 1.向student表中添加一条新记录 2. 向student表中添加多条新记录 3.向student表中添加一条新记录 4.更新表&#xff0c;grade 大于90的加0.5 5.删除成绩为空的记录 二、用户权限部分 1、创建一个用户test1使他只能本地登录拥有查询student表的权…

http读书笔记

持久化 HTTP/1.1 和一部分的 HTTP/1.0 想出了 持久连接&#xff08;HTTP Persistent Connections&#xff0c; 也称为 HTTP keep-alive 或 HTTP connection reuse&#xff09; 的方法。 持久连接的特点是&#xff0c; 只要任意一端 没有明确提出断开连接&#xff0c; 则保持 T…

信用卡没逾期就万事大吉了吗?

6月28日&#xff0c;中国人民银行揭晓了《2024年第一季度支付体系概览》&#xff0c;数据显示&#xff0c;截至本季度末&#xff0c;信用卡及借贷合一卡的总量为7.6亿张&#xff0c;与上一季度相比&#xff0c;这一数字微降了0.85个百分点。同时&#xff0c;报告还指出&#xf…

【Unity】unity学习扫盲知识点

1、建议检查下SystemInfo的引用。这个是什么 Unity的SystemInfo类提供了一种获取关于当前硬件和操作系统的信息的方法。这包括设备类型&#xff0c;操作系统&#xff0c;处理器&#xff0c;内存&#xff0c;显卡&#xff0c;支持的Unity特性等。使用SystemInfo类非常简单。它的…

HTML5使用<progress>进度条、<meter>刻度条

1、<progress>进度条 定义进度信息使用的是 progress 标签。它表示一个任务的完成进度&#xff0c;这个进度可以是不确定的&#xff0c;只是表示进度正在进行&#xff0c;但是不清楚还有多少工作量没有完成&#xff0c;也可以用0到某个最大数字&#xff08;如&#xff1…

ctfshow web sql注入 web242--web249

web242 into outfile 的使用 SELECT ... INTO OUTFILE file_name[CHARACTER SET charset_name][export_options]export_options:[{FIELDS | COLUMNS}[TERMINATED BY string]//分隔符[[OPTIONALLY] ENCLOSED BY char][ESCAPED BY char]][LINES[STARTING BY string][TERMINATED…

C++11|包装器

目录 引入 一、function包装器 1.1包装器使用 1.2包装器解决类型复杂 二、bind包装器 引入 在我们学过的回调中&#xff0c;函数指针&#xff0c;仿函数&#xff0c;lambda都可以完成&#xff0c;但他们都有一个缺点&#xff0c;就是类型的推导复杂性&#xff0c;从而会…

aardio —— 今日减bug

打字就减bug 鼠标双击也减bug 看看有多少bug够你减的 使用方法&#xff1a; 1、将资源附件解压缩&#xff0c;里面的文件夹&#xff0c;放到aardio\plugin\plugins 目录 2、aardio 启动插件 → 插件设置 → 选中“今日减bug” → 保存。 3、重启 aardio&#xff0c;等aa…

解决IDEA每次新建项目都需要重新配置maven的问题

每次打开IDEA都要重新配置maven&#xff0c;这是因为在DEA中分为项目设置和全局设置&#xff0c;这个时候我们就需要去到全局中设置maven了。我用的是IntelliJ IDEA 2023.3.4 (Ultimate Edition)&#xff0c;以此为例。 第一步&#xff1a;打开一个空的IDEA&#xff0c;选择左…

起飞,纯本地实时语音转文字!

简介 偶然在 github 上翻到了这个项目 https://github.com/k2-fsa/sherpa-ncnn 在没有互联网连接的情况下使用带有 ncnn 的下一代 Kaldi 进行实时语音识别。支持 iOS、Android、Raspberry Pi、VisionFive2、LicheePi4A等。 也就是说语音转文字可以不再借助网络服务的接口&am…

昇思MindSpore学习笔记4-03生成式--Diffusion扩散模型

摘要&#xff1a; 记录昇思MindSpore AI框架使用DDPM模型给图像数据正向逐步添加噪声&#xff0c;反向逐步去除噪声的工作原理和实际使用方法、步骤。 一、概念 1. 扩散模型Diffusion Models DDPM(denoising diffusion probabilistic model) &#xff08;无&#xff09;条件…

昇思25天学习打卡营第8天|模型权重与 MindIR 的保存加载

目录 导入Python 库和模块 创建神经网络模型 保存和加载模型权重 保存和加载MindIR 导入Python 库和模块 上一章节着重阐述了怎样对超参数予以调整&#xff0c;以及如何开展网络模型的训练工作。在网络模型训练的整个进程当中&#xff0c;事实上我们满怀期望能够留存中间阶段…

眼底图像生成新 SOTA:GeCA模拟生物细胞的演变过程

眼底图像生成新 SOTA&#xff1a;GeCA模拟生物细胞的演变过程 提出背景GeCA 框架生成元胞自动机&#xff1a;从单细胞到生物体的过程生物体从单个像素细胞开始细胞扩散&#xff1a;从细胞演变为生物体通过基因遗传改进逆向采样视网膜疾病分类GeCA 逻辑拆解子解法1&#xff1a;神…

Go高级库存照片源码v5.3

GoStock – 免费和付费库存照片脚本这是一个免费和付费共享高质量库存照片的平台,用户可以上传照片与整个社区和访客分享,并可以通过 PayPal 接收捐款。此外,用户还可以点赞、评论、分享和收藏您最喜欢的照片。 下载 特征: 使用Laravel 10构建订阅系统Stripe 连接渐进式网页…

【Python机器学习】模型评估与改进——分层k折交叉验证

在k折分层验证中&#xff0c;将数据集划分为k折时&#xff0c;从数据的前k分之一开始划分&#xff0c;这可能并不总是一个好主意&#xff0c;例如iris数据集中&#xff1a; from sklearn.datasets import load_irisirisload_iris() print(Iris labels:\n:{}.format(iris.targe…

2.Python学习:数据类型和变量

1.标识符命名规则 只能由数字、字母、下划线组成不能以数字开头不能是关键字&#xff08;如class等python内部已经使用的标识符&#xff09;区分大小写 查看关键字&#xff1a; print(keyword.kwlist)2.数据类型 2.1常见数据类型 2.1.1Number数值型&#xff1a; 整数int&a…

13 - Python网络编程入门

网络编程入门 计算机网络基础 计算机网络是独立自主的计算机互联而成的系统的总称&#xff0c;组建计算机网络最主要的目的是实现多台计算机之间的通信和资源共享。今天计算机网络中的设备和计算机网络的用户已经多得不可计数&#xff0c;而计算机网络也可以称得上是一个“复…

自定义isdate函数,判定日期字符串有效性

自定义isdate函数&#xff0c;按日期“属性”&#xff0c;判定字符串日期有效性。 (笔记模板由python脚本于2024年07月05日 15:28:04创建&#xff0c;本篇笔记适合喜欢探究python内建模块的coder翻阅) 【学习的细节是欢悦的历程】 Python 官网&#xff1a;https://www.python.o…

One day for Chinese families

周围生活中的普通家庭的一天流程&#xff1a; 【上班的一天】 【放假的一天】 有家庭的人&#xff0c;上班流程&#xff1a; 01&#xff09;准备早餐&#xff0c;牛奶&#xff0c;面包 02&#xff09;叫娃娃起床&#xff0c;一般要蛮久的&#xff1b;沟通交流 -- 哄娃娃 -- 生气…

2-5 softmax 回归的简洁实现

我们发现通过深度学习框架的高级API能够使实现线性回归变得更加容易。 同样&#xff0c;通过深度学习框架的高级API也能更方便地实现softmax回归模型。 本节如在上节中一样&#xff0c; 继续使用Fashion-MNIST数据集&#xff0c;并保持批量大小为256。 import torch from torc…