windows C/C++ 线程创建

windows多线程基础(5):使用_beginthreadex创建线程(C/C++ Runtime Library考虑) 标准CRT(C Runtime Library)问世于1970年,没有考虑到将CRT运行于多线程应用程序的问题。 在多线程环境中存在问题的C/C++运行期库变量和函数包括:error, _doserrno, strtok, strerror, asctime, gmtime,malloc等等。这些函数中都存在全局变量或者要访问全局变量(对于malloc来说,进程的堆也算是全全局的了),所 阅读详情
	创建线程				
	HANDLE CreateThread(				
	  LPSECURITY_ATTRIBUTES lpThreadAttributes, // 安全属性 通常为NULL				
	  SIZE_T dwStackSize,                       // 参数用于设定线程可以将多少地址空间用于它自己的堆栈				
					        // 每个线程拥有它自己的堆栈
	  LPTHREAD_START_ROUTINE lpStartAddress,    // 参数用于指明想要新线程执行的线程函数的地址				
	  LPVOID lpParameter,                       // 线程函数的参数				
					        // 在线程启动执行时将该参数传递给线程函数
					        // 既可以是数字,也可以是指向包含其他信息的一个数据结构的指针
	  DWORD dwCreationFlags,                    // 0 创建完毕立即调度  CREATE_SUSPENDED创建后挂起				
	  LPDWORD lpThreadId                        // 线程ID 				
	);				
					        // 返回值:线程句柄
	线程句柄与线程ID:				
	线程是由Windows内核负责创建与管理的,句柄相当于一个令牌,有了这个令牌就可以使用线程对象.							
	线程ID是身份证,唯一的,系统进行线程调度的时候要使用的.				
					
	创建线程代码:				
	//创建一个新的线程				
	HANDLE hThread = ::CreateThread(NULL, 0, ThreadProc, 				
		NULL, 0, NULL);			
					
	//如果不在其他的地方引用它 关闭句柄				
	::CloseHandle(hThread);				
					
	线程函数:				
	DWORD WINAPI ThreadProc(				
			     LPVOID lpParameter   // thread data		
			     )		
							
	向线程函数传递变量的两种方式:									
	(1) 全局变量									
	(2) 线程参数		


    									
	挂起线程:								
									
	::SuspendThread(hThread);								
									
	恢复线程:								
									
	::ResumeThread(hThread);					      同步调用		异步调用	
									
	终止线程:						                //		
									
	方式一:						                 ::TerminateThread(hThread,3);		
							                     ::WaitForSingleObject(hThread,INFINITE);		
	::ExitThread(DWORD dwExitCode);								
							                        //执行功能		
	方式二:								
									
	线程函数返回								
							                        //		
	方式三:								
									
	::TerminateThread(hThread,2);								
	::WaitForSingleObject(hThread,INFINITE);								
									
	判断线程是否结束								
									
	BOOL GetExitCodeThread(								
	  HANDLE hThread,								
	  LPDWORD lpExitCode								
	);								
									
	STILL_ACTIVE 正在运行								
									
									
	参数:													
	hThread: 要结束的线程句柄								
	dwExitCode: 指定线程的退出代码。可以通过GetExitCodeThread来查看一个线程的退出代码

    线程上下文  							
typedef struct _CONTEXT {							
							
    //							
    // The flags values within this flag control the contents of							
    // a CONTEXT record.							
    //							
    // If the context record is used as an input parameter, then							
    // for each portion of the context record controlled by a flag							
    // whose value is set, it is assumed that that portion of the							
    // context record contains valid context. If the context record							
    // is being used to modify a threads context, then only that							
    // portion of the threads context will be modified.							
    //							
    // If the context record is used as an IN OUT parameter to capture							
    // the context of a thread, then only those portions of the thread's							
    // context corresponding to set flags will be returned.							
    //							
    // The context record is never used as an OUT only parameter.							
    //							
							
    DWORD ContextFlags;							
							
    //							
    // This section is specified/returned if CONTEXT_DEBUG_REGISTERS is							
    // set in ContextFlags.  Note that CONTEXT_DEBUG_REGISTERS is NOT							
    // included in CONTEXT_FULL.							
    //							
							
    DWORD   Dr0;							
    DWORD   Dr1;							
    DWORD   Dr2;							
    DWORD   Dr3;							
    DWORD   Dr6;							
    DWORD   Dr7;							
							
    //							
    // This section is specified/returned if the							
    // ContextFlags word contians the flag CONTEXT_FLOATING_POINT.							
    //							
							
    FLOATING_SAVE_AREA FloatSave;							
							
    //							
    // This section is specified/returned if the							
    // ContextFlags word contians the flag CONTEXT_SEGMENTS.							
    //							
							
    DWORD   SegGs;							
    DWORD   SegFs;							
    DWORD   SegEs;							
    DWORD   SegDs;							
							
    //							
    // This section is specified/returned if the							
    // ContextFlags word contians the flag CONTEXT_INTEGER.							
    //							
							
    DWORD   Edi;							
    DWORD   Esi;							
    DWORD   Ebx;							
    DWORD   Edx;							
    DWORD   Ecx;							
    DWORD   Eax;							
							
    //							
    // This section is specified/returned if the							
    // ContextFlags word contians the flag CONTEXT_CONTROL.							
    //							
							
    DWORD   Ebp;							
    DWORD   Eip;							
    DWORD   SegCs;              // MUST BE SANITIZED							
    DWORD   EFlags;             // MUST BE SANITIZED							
    DWORD   Esp;							
    DWORD   SegSs;							
							
    //							
    // This section is specified/returned if the ContextFlags word							
    // contains the flag CONTEXT_EXTENDED_REGISTERS.							
    // The format and contexts are processor specific							
    //							
							
    BYTE    ExtendedRegisters[MAXIMUM_SUPPORTED_EXTENSION];							
							
} CONTEXT;							
							
							
获取线程CONTEXT结构:							
							
//挂起线程							
SuspendThread(线程句柄);							
							
CONTEXT context							
							
//设置要获取的类型							
							
context.ContextFlags = CONTEXT_CONTROL;							
							
//获取							
							
BOOL ok = ::GetThreadContext(hThread,&context);							
							
//设置							
context.Eip = 0x401000;											
SetThreadContext(hThread,&context);							
								

 

windows下线程C/C++运行库 window下C/C++运行库 以下内容引述至《windows核心编程》 C/C++运行库 库名称 描述 LibCMt.lib 库的静态链接发行版本 LibCMtD.lib 库的静态链接调试版本 MSVCRt.lib 导入库,用于动态链接MSVCR80.dll库的发行版本(默认) MSVCRtD.lib 导入库,用于动态链接MSVCR80D.dll库的调试版本 MS... 阅读详情

相关推荐

c/c++ Windows 多线程

进程/线程 # 1: 每一个程序运行的时候,操作系统会给这个程序分配一个进程,以32位的操作系统为例:就会分配4GB的虚拟内存空间(代码段,数据段,栈,堆),将程序的代码加载到代码段,并运行程序,执行程序的指令; 2:什么是线程 (1)线程是基于进程的轻量级的调度单元,线程是在一个进程中创建出来的,当一个进程出来后,他本身就对应为一个线程。 (2)一个进程还可以创建多个线程,这些...

Economic_shark的博客 3471

C++几种创建线程的方法

HANDLE 句柄的CreateThread HANDLE WINAPI CreateThread(In_opt LPSECURITY_ATTRIBUTES lpThreadAttributes, {安全设置}In SIZE_T dwStackSize, {堆栈大小}In LPTHREAD_START_ROUTINE lpStartAddress, {入口函数}In_opt __drv_alia...

qq512719的博客 1307

3.Windows核心编程-线程及线程调度

线程 与进程类似,线程也由两个组件组成: 一个是线程的内核对象,操作系统用它管理线程。内核对象还是系统用来存放线程统计信息的地方; 一个线程堆栈,用于维护线程执行时所需的所有函数参数和局部变量。 //线程函数//创建线程 HANDLE CreateThread( PSECURITY_ATTRIBUTES psa, //线程安全属性 DWORD

BX's Blog 2351

C语言多线程

在C语言中创建线程方式如下 #include <pthread.h> pthread_create (thread, attr, start_routine, arg) 其中,thread为线程指针;attr为线程属性,默认NULL;start_routine为线程运行函数起始地址;arg为运行函数的参数。无参数时使用NULL。 如果线程成功创建,函数返回0,否则说明创建失败。 当线程完成工作后,若无需继续存在,则会调用pthread_exit函数。也就是说,这个函数可以显式地退出一个线程。

微小冷的学习笔记 9606

Qt Design Studio 入门指南:从零开始打造炫酷UI(详细+实用+轻松上手)

本文是Qt Design Studio的详细入门指南,旨在帮助UI设计新手从零开始轻松打造炫酷界面。文章系统介绍了软件的核心概念、安装步骤、主界面解析,并通过创建一个完整的登录界面实例,手把手教学如何拖拽组件、设置属性、添加交互状态与动画。同时,分享了创建自定义组件、管理资源以及提升效率的实用技巧与常见问题解决方案,让读者能够快速上手并应用于实际项目开发。

devops8pract的博客 589

Type-c超声波切割刀

接下来,我将提供Type-C超声波切割刀项目的C代码实现示例,代码将按照上述分层架构和模块化设计进行组织。为了达到3000行以上的代码量,我将尽可能详细地实现各个模块的功能,并添加必要的注释和错误处理。通过采用分层架构和模块化设计,我们可以建立一个可靠、高效、可扩展的系统平台,为产品的成功奠定坚实的基础。实际项目中,需要更详细的硬件驱动、更完善的功能模块、更严格的测试验证和更周全的维护升级计划。针对Type-C超声波切割刀这个项目,我将从以下几个方面详细阐述最适合的代码设计架构,并提供具体的C代码实现。

lianmengde的博客 1191

线程创建 三种方式

文章目录多线程编程一、线程、进程、多线程、程序概念二、线程创建的三种方法——重头戏线程创建方式1:继承Thread类线程创建方式2:实现Runnable接口多线程实例线程创建方式3:实现Callable接口 多线程编程 一、线程、进程、多线程、程序概念 多线程是多任务的一种特别的形式,但多线程使用了更小的资源开销。 简单理解下 多任务: eg:一个人边骑车边看电脑 多线程: eg:原来一条路太窄只能走一个人,现拓宽可走三个人 一个进程中可以并发多个线程,每条线程并行执行不同的任务。 进程和程序的区

qq_46509219的博客 2719

Fastjson2 2.0.26反序列化漏洞深度剖析:从原理到PoC构造

本文深度剖析了Fastjson2在2.0.26及之前版本中存在的反序列化漏洞。该漏洞允许攻击者通过构造包含恶意TemplatesImpl对象的JSONArray,并利用BadAttributeValueExpException触发,在反序列化过程中实现远程代码执行。文章从漏洞原理、PoC构造、利用链分析到防御建议,提供了全面的技术解读,帮助开发者和安全人员理解其危害并采取应对措施。

d3e4f的博客 1051

c 创建线程

#include "stdio.h" #include "stdlib.h" #include <sys/types.h> #include <unistd.h> #include "pthread.h" void *thread_body(void *arg) { printf("thread: pid = %d, thread_id = %lu\n", getpid(), pthread_self()); return NULL; } int main ().

beOkWithAnything 1998

第八届传智杯WPS智能办公能力挑战赛练习题库

本文是关于WPS Office软件操作知识的选择题汇总,内容涵盖WPS文字、表格和演示三大组件的常用功能。主要包括:云文档协同编辑、文本框插入、幻灯片打印设置、数据排序与筛选、函数应用(如SUMIF、COUNT)、动画效果设置、格式刷使用、页眉页脚设置、单元格引用类型等基础操作要点。同时涉及计算机基础概念如二进制、ROM存储器等。题目以单选和多选形式呈现,附带详细答案解析,全面检验用户对WPS办公软件的功能掌握程度和实际操作能力,适用于办公软件技能培训和水平测试。

qq_73044452的博客 1432

Mac安装Typescript报错

根本原因是系统级目录的权限限制。推荐通过修改目录权限或使用nvm彻底解决问题。

江拥羡橙的博客 210

一文搞定之C语言多线程

C语言多线程编程的基础知识

树欲静静风不止止的博客 8458

【CANdelaStudio编辑CDD】-21.2-创建OBD诊断$03,$07,$0A和$04服务以及OBD DTC

案例背景(共11页精讲):创建OBD诊断$03,$07,$0A和$04服务;以及OBD DTC。 在《【ISO15031_OBD诊断】-3.1-$03服务Request emission-related diagnostic trouble codes理论部分https://blog.youkuaiyun.com/qfmzhu/article/details/122157513》, 《【ISO15031_OBD诊断】-7.1-$07服务Request emission-related diagnostic trou

「汽车电子助手」的博客 1697

C/C++ 线程的创建和释放

在这个示例中,我们创建了一个新线程,该线程执行MyThreadFunction函数。然后,我们使用WaitForSingleObject等待线程完成。最后,我们使用CloseHandle关闭线程句柄。CreateThread、WaitForSingleObject和CloseHandle是Windows操作系统中用于线程管理的三个函数。在这个示例中,我们创建了 5 个线程,每个线程都执行。是用于创建和等待线程完成的函数。

lijian2017的博客 1561

2025年最新自动化/控制保研夏令营&预推免面试真题分享(东南大学苏州校区/华东理工/南航/天大)

笔者来2021级本科自动化专业,以下部分将介绍我在夏令营以及预推免期间发生经历和问题。

Control Everything 2583

Python实现稳态传热传质的偏微分方程求解

通过这种方法,我们可以求解更复杂的传热传质问题,并对系统的温度和浓度分布进行分析和优化。稳态传热传质是一个重要的工程问题,涉及到物质在空间中的分布以及热量和质量的传递。每次迭代中,我们使用上一次迭代的温度值来计算下一次迭代的温度值。该图显示了平板内部各点的温度分布,其中中心温度为T1,边界温度为T2。接下来,我们创建一个N x N的温度矩阵,并将边界条件初始化为边界温度T2。假设我们有一个矩形平板,其中心温度为T1,四个边界温度为T2。假设平板的长度为L,宽度为W,中心温度为T1,边界温度为T2。

HackDashX的博客 308

C/C++:Windows编程—创建进程、终止进程、枚举进程、枚举线程、枚举DLL

进程、线程及DLL枚举API介绍 无论是枚举进程还是枚举进程中的DLL文件,方法都是相同的,都是通过创建指定的相关快照,再通过循环逐条获取快照的内容。类似的枚举线程、枚举堆都是相同的方法,差别只是在创建快照时的参数不同,逐条获取快照的内容时的API函数不同而已。 枚举进程的API函数:CreateToolhelp32Snapshot()、Process32First()、Process32Next...

重庆李四 7431

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

创建线程、打印当前时间--windows C/C++

GetLocalTime(&sTime): 获取当前时间 CreateThread:创建线程 sleep(ms) : 延时 #include<stdio.h> #include<Windows.h> DWORD WINAPI ThreadFunc(LPVOID p) { int index = 0; SYSTEMTIME sTime; char szBuf[512], * lpTxt = szBuf; printf("child thread

u010743406的博客 1415

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

windows核心编程笔记第10篇 (线程创建的过程和基于C/C++运行库的_beginthreadex)

http://www.cnblogs.com/wParma/archive/2009/10/30/1593002.html 线程定义 线程也是由两个部分组成的: • 一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。 • 另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量(第1 6章将进一步介绍系统如何管理线程堆栈)。

miao6664659的专栏 861

Windows核心编程笔记第十篇(线程创建的过程和基于C/C++运行库的 _beginthreadex)...

线程定义 线程也是由两个部分组成的: • 一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。 • 另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量(第1 6章将进一步介绍系统如何管理线程堆栈)。 如何创建线程:HANDLECreateThread(PSECURITY_ATTRIBUTESpsa,//安全结构体如果...

weixin_30416497的博客 148

Windows核心编程笔记第十篇(线程创建的过程和基于C/C++运行库的 _beginthreadex)

线程定义 线程也是由两个部分组成的: • 一个是线程的内核对象,操作系统用它来对线程实施管理。内核对象也是系统用来存放线程统计信息的地方。 • 另一个是线程堆栈,它用于维护线程在执行代码时需要的所有函数参数和局部变量(第1 6章将进一步介绍系统如何管理线程堆栈)。 如何创建线程: HANDLE CreateThread(   PSECURITY_ATTRIBUTES psa,   //安...

dreamisfling的专栏 197

[C/C++]Windows多线程入门实例讲解

介绍windows系统下,利用C/C++多线程的编写。 1 创建线程 HANDLE CreateThread( //windows创建线程的API函数 LPSECURITY_ATTRIBUTES lpThreadAttributes,//SD:线程安全相关的属性,常置为NULL SIZE_T dwStackSize,//initialstacksize:新线程的初始化栈的大小,可设置为0 LPTHREAD_START_ROUTINE lpStartAddress,//threadfunction:被线程

qq_41221520的博客 880

C/C++获取指定线程挂起次数

C/C++获取指定线程挂起次数

weixin_42270114的博客 4396

Windows核心编程:线程基础

作者:shenzi链接:http://blog.youkuaiyun.com/shenziWindows核心编程:线程基础2.线程    2.1线程概念     线程包括下面的必要组件:CPU寄存器的内容,它表示寄存器的状态;两个栈:一个是以内核模式执行时被线程使用,另一个则是以用户模式执行时被线程使用;被称为“本机线程存

shenzi的天空 3589

Windows内核之线程启动的背后

1       CreateThread函数调用后发生事情: 1.1:创建一个系统内核对象,并且初始化系统内核对象 线程的内核对象包括:context(设备上下文),使用计数,暂停计数,退出代码,已通知。 使用计数 = 2;暂停计数 = 1;退出代码 = STILL_ACTIVE;已通知=FALSE;上下文之SP(堆栈指针)= 线程的入口函数地址,上下文之IP= BaseThreadStar

eskimoer的专栏 3202

Windows线程简介

线程由以下两部分构成。一个线程的内核对象,操作系统用它来管理线程。系统还用内核对象来存放线程统计信息的地方。一个线程栈,用于维护线程执行时所需的所有函数参数和局部变量。进程是惰性的。从来不执行任何东西,它只是一个线程的容器。线程必然是某个进程的上下文中创建的,而且会在这个进程内部“终其一生”。这意味着线程要在其进程的地址空间内执行代码和处理数据。假如一个进程上下文中有两个以上的线程运行,这些线程将共享同一个地址空间。这些线程可以执行同样的代码,可以处理相同的数据。

希望能帮助大家,希望大家多多支持,你们的支持是我前进的动力。 1892
上一篇: OD 中 MFC 窗口回调函数定位
下一篇: windows C/C++ 线程安全(一)临界区
__网瘾少年
博客等级 码龄11年 122粉丝 103原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值