多线程 -- 线程基础

电子学习资料实验指导书电子线路课程设计题 立即下载

进程与线程

理解线程是至关重要的,每个进程至少有一个线程,进程是线程的容器,线程才是真正的执行体,线程必然在某个进程的上下文中运行。进程拥有惰性,如果进程中所有的线程

都已结束,那么进程也就没有存在的必要了。

一个进程由如下两部分组成:1、一个进程地址空间;2、一个进程内核对象

一个线程由如下两部分组成:1、一个线程栈;2、一个线程内核对象

线程的开销要比进程少很多,所以在解决编程问题的时候尽量考虑在当前进程中创建线程而不是创建新的进程。然而,线程的切换需要消耗一定数量的CPU资源,因此,也不

是说可以毫无顾忌的使用线程来处理问题。

 

线程生命周期

线程的创建

系统创建一个线程内核对象;

系统在当前进程的中预订一块线程栈空间,并调拨一些物理内存;

线程终止运行

释放线程所拥有的所有用户对象(不太理解)

线程退出代码从STILL_ACTIVE变成真正的退出代码

线程内核对象变为触发状态

如果线程是进程中最后一个活动线程,进程将终止

线程内核对象的使用计数减1

 

线程的创建和终止方法


无论你使用什么编程语言,什么类库,在Windows平台下最终创建线程都应该有下面的API


1
2
3
4
5
6
7
8
HANDLE  WINAPI CreateThread(
   __in_opt   LPSECURITY_ATTRIBUTES lpThreadAttributes, //安全描述符,一般传入NULL,但其中的bInheritHandle标志位说明线程内核对象是否允许子进程继承
   __in       SIZE_T  dwStackSize, //线程栈初始化大小,该值可以传入0,系统会从/STACK链接选项和此值两个中选一个较大的
   __in       LPTHREAD_START_ROUTINE lpStartAddress, //线程执行的初始函数的地址
   __in_opt   LPVOID  lpParameter, //传入初始函数的参数
   __in       DWORD  dwCreationFlags, //指定线程是否能被立即调度(即是否立即执行),如果为CREATE_SUSPENDED,系统会在初始化后暂停线程的运行
   __out_opt  LPDWORD  lpThreadId //线程ID,可以传入NULL
);


需要说明的是线程初始函数总是拥有如下函数签名:


1
2
3
DWORD  WINAPI ThreadProc(
   __in  LPVOID  lpParameter
);

该函数返回创建好的线程内核对象的句柄。除非该句柄值将用作他用,否则应该立即调用CloseHandle来关闭句柄,当然关闭句柄不会终止线程的运行,但可以保证线程在退

出后即使的释放线程内核对象。

终止线程的方式有线程初始函数返回、线程自己调用ExitThread终止自己、外部线程调用TerminateThread、包含线程的进程终止运行。其中除了第一种方法,其他都是不

推荐的方式,因为线程不正常退出不能保证资源的正确释放

使用ExitThread还能保证系统销毁线程的堆栈,但TerminateThread将无法做到,直到进程终止;

 

线程的初始化内幕

image

CreateThread导致系统创建一个线程内核对象,该对象的初始引用计数为2。线程正常退出将递减一次,关闭线程句柄将递减一次,引用计数为0时,操作系统会释放

改内核对象。暂停计数设置为1,退出代码设置为STILL_ACTIVE,对象被设置为未触发状态。

系统从进程地址空间中分配线程栈,并在高位写入pvParam和pfnStratAddr。

每个线程都有其自己的一组CPU寄存器,称为线程上下文。上下文反映了线程上一次执行时,线程的CPU寄存器状态。当线程被重新调度时,保存在内核对象中的上下文将回

写到CPU寄存器,以恢复线程的最后状态,这个过程称为“上下文切换”。其中最为重要的两个寄存器是堆栈寄存器(SP)和指令寄存器(IP),SP指向pfnStartAddr在堆栈中的

地址,IP指向RtlUserThreadStart函数(NTDLL.dll导入)。Windows实际上提供了一个描述线程上下文的结构CONTEXT,并且提供了如下两个函数获得和设置上下文:


1
2
3
4
5
6
7
8
9
BOOL  WINAPI GetThreadContext(
   __in     HANDLE  hThread,
   __inout  LPCONTEXT lpContext
);
 
BOOL  WINAPI SetThreadContext(
   __in  HANDLE  hThread,
   __in  const  CONTEXT *lpContext
);

CONTEXT结构可能是Windows平台上唯一一个跟CPU有关的结构,所以如果要设置该结构可能需要考虑不同CPU的情况,而且如果设置不当,很有可能导致灾难性的后果。

线程完全初始化好之后,系统将检查CreateThread函数中的dwCreationFlags,如果此标记不是CREATE_SUSPENDED,系统将把挂起计数递减至0,以便处理器调度该

线程。

 

Microsoft C/C++运行库注意事项

Visual Studio附带了4个C/C++运行库用于开发,还有两个面向.NET托管环境。现在所有的库都支持多线程开发,已经没有专门针对单线程开发的运行库(C\C++运行库的

出现早于多任务操作系统,因此当时有支持单线程的运行库):

库名称 描述
LibCMt.lib 库的静态链接发行版本

LibCMtD.lib
库的静态链接调试版本
MSVCRt.lib 导入库,用于动态链接MSVCRxxx.dll库的发行版本
MSVCRtD.lib 导入库,用于动态链接MSVCRxxxD.dll库的调试版本(默认)
MSVCMRt.lib 导入库,用户托管/本机代码混合
MSVCURt.lib 导入库,编译成百分之百的纯MSIL代码

始终应该用运行库的_beginthreadex来创建线程,以及用_endthreadex来代替ExitThread。

 

线程的挂起、恢复和睡眠


如上文所讨论的,线程在创建的时候可以设置是否挂起。我们可以通过如下两个函数来挂起和恢复线程


1
2
3
4
5
6
7
DWORD  WINAPI SuspendThread(
   __in  HANDLE  hThread
);
 
DWORD  WINAPI ResumeThread(
   __in  HANDLE  hThread
);

调用SuspendThread将递增线程内核对象的挂起计数,可以挂起多次,对应的也可以恢复多次。另外,没有完美的“挂起进程”的函数,因为唯一的方法就是遍历并挂起进程

中的所有线程,然而在遍历的过程中如果有新的线程创建了呢,亦或是刚遍历的线程销毁了呢。因此试图“挂起进程”要十分小心,尽量避免。

使用下面的函数指定挂起当前线程一段时间

1
2
3
VOID  WINAPI Sleep(
   __in  DWORD  dwMilliseconds
);



出处:http://www.cnblogs.com/P_Chou/archive/2012/06/10/basic-of-thread.html

ShanYangClaw (DevMate)-python+agent-project 项目代码 立即下载

相关推荐

参数估计Picard迭代在非线性常微分方程参数估计中的应用研究(Matlab代码实现)

内容概要:本文系统研究了Picard迭代法在非线性常微分方程参数估计中的应用,深入阐述了该方法的数学原理及其在参数辨识中的收敛性与稳定性优势。通过构建最小化误差的目标函数,并结合数值积分技术,采用迭代方式逐步逼近系统的真实参数值,有效解决了非线性动态系统中因缺乏解析解而难以进行精确建模的问题。文中提供了完整的Matlab代码实现,涵盖模型定义、迭代求解、参数更新与结果可视化等关键环节,增强了方法的可操作性与工程实用性。研究通过典型非线性系统案例验证了算法的有效性,展示了其在科学计算与工程建模中的良好适应性与推广潜力。; 适合人群:具备常微分方程理论、数值分析基础及Matlab编程能力,从事系统建模、参数辨识、动力学仿真等相关方向的研究生、科研人员和工程技术开发者。; 使用场景及目标:①解决实际工程中非线性微分方程模型的未知参数估计问题;②深入理解Picard迭代法在科学计算中的实现机制与数值特性;③为学术论文复现、科研项目开发或课程设计提供可运行、易调试的技术方案与代码参考。; 阅读建议:建议读者结合文中的数学推导与Matlab代码逐行分析,重点关注迭代流程、目标函数构造与数值积分的耦合实现,通过修改模型结构或噪声条件进行扩展实验,以深化对算法鲁棒性与适用边界的理解。配套资源可通过指定公众号和网盘链接获取,推荐同步学习以加速科研进程。

多线程——1线程基础

Java多线程基础 一、文章内容 1.多线程基本介绍 2.多线程hello world 3.创建线程的方式 4.Runnable介绍 5.面试点 注意:如果觉得以上内容简单可跳过本文内容,本文主要针对没怎么了解过多线程的读者 二、正式开始 1. 多线程基本介绍 废话不多说,既然大家看到了这篇文章证明大家已经对多线程有了基础的了解; 一句话多线程就是原本由一个人干的活现在找了多个人来同时做(如...

sui_feng_piao_guo的博客 2261

XYF.SHX

XYF.SHX

JAVA多线程基础

JAVA多线程基础 1.什么是并发原理? 多线程多线程允许我们“同时”执行多段代码。 线程是并发运行的,线程调度会统一规划CPU时间,将CPU的时间划分为若干片段,然后尽可能的均匀分配给所要并发运行的线程,每个线程在获取CPU时间片段后CPU就会运行它的任务,当时间片段用完后,Cpu会离开并执行获取到CPu时间片的线程,所以,所有线程并非真正的“同时”运行着代码,而是走走停停,这种微观上走走停停,在宏观上感觉是同步进行的现象称为“并发运行”。 2.创建线程Thread 1. 方式一:继承Thread并重写

weixin_47600732的博客 4274

多线程基础

并发与并行的关系及区别。什么是线程,以及如何创建线程。JVM线程状态以及相互间是如何转换的。

庄子兄弟的博客 828

多线程基础

本文将讲述多线程基础部分,将从基本概念、线程创建、线程的方法、线程同步、互斥锁、死锁和释放锁讲述线程

weixin_67007064的博客 1041

『Java多线程基础基础

Java基础篇~多线程 线程概念 程序(Program) ​ 程序是指令、数据及其组织形式的描述,也就是存储在磁盘或者其他存储设备中含有指令和数据的文件,是一段静态代码 进程(Process) ​ 进程是受操作系统管理的基本单元,是程序的一次动态执行过程,是系统进行资源分配和调度的基本单位,它对应了从代码加载、执行到执行完毕的整个过程,即进程的创建、运行到消亡的过程。从某种程度上来说,进程是正在运行程序的实例,是一个动态概念 多任务(Multi Task) ​ 在一

像写诗一样优雅地写代码~ 7623

多线程-01 多线程基础

多线程基础 在这里插入代码片 多线程应用

csfun1的博客 273

【Java EE】多线程-初阶 多线程的一些基础用法

使⽤没有共享资源的模型适⽤共享资源只读,不写的模型a. 不需要写共享资源的模型b. 使⽤不可变对象直⾯线程安全(重点)a. 保证原⼦性b. 保证顺序性c. 保证可⻅性1.线程的优点创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多与进程之间的切换相⽐,线程之间的切换需要操作系统做的⼯作要少很多线程占⽤的资源要⽐进程少很多能充分利⽤多处理器的可并⾏数量在等待慢速I/O操作结束的同时,程序可执⾏其他的计算任务。

2402_85428625的博客 3137

多线程基础

什么是进程?一个进程就是一个运行的程序(app)例如: idea,内网通,qq,微信进程是电脑资源分配的最小单位进程中至少包含一个线程进程中的资源,线程会共享,比如堆中的对象,静态域中的数据什么是线程?线程是进程中的一个执行路径线程是资源调度的最小单位在内存栈中的数据,是属于线程的为什么需要多线程?因为代码运行是有顺序的,执行完前面才能执行后面但是很多时候,需要功能同时执行即提升资源利用率,提升效率Java代码是多线程的吗?是,至少有两个代码运行的main线程

weixin_61898502的博客 1144

【iOS】多线程基础

本文介绍了iOS多线程编程的基础知识。主要内容包括: 进程与线程的概念区别: 进程是资源分配的最小单位,线程是程序执行的最小单位 线程共享进程资源,切换开销更小 多线程原理: 单核CPU通过快速切换线程实现"同时执行"效果 影响执行速度的因素包括CPU调度、任务复杂度等 线程的生命周期: 新建-就绪-运行-阻塞-死亡五个阶段 介绍了线程的exit和cancel方法 线程安全: 对比了互斥锁和自旋锁的特点 分析了atomic原子属性的实现原理 线程间通信方式 NSOperation的基本使

2301_79847748的博客 1473

焊接变位机_1.rar

焊接变位机_1.rar

基于多尺度集成极限学习机回归(Matlab代码实现)

内容概要:本文详细介绍了一种基于多尺度集成极限学习机(Extreme Learning Machine, ELM)的回归方法,并提供了完整的Matlab代码实现。该方法通过构建多尺度特征表示与集成学习机制,有效提升了ELM在处理非线性、高维复杂数据时的预测精度与模型鲁棒性,特别适用于时间序列回归任务。文档不仅阐述了算法的核心原理与技术流程,还系统展示了其在风电功率预测等工程场景中的应用潜力。同时,文中附带了丰富的科研仿真案例集合,涵盖智能优化算法、深度学习、信号处理、电力系统调度等多个前沿方向,体现了多学科交叉融合的技术优势与实践价值。; 适合人群:具备一定Matlab编程能力,从事科学研究或工程应用的研究生、科研人员及工程技术开发者,尤其适合专注于机器学习、智能算法优化、新能源预测与电力系统建模等相关领域的专业人员。; 使用场景及目标:①用于风电、光伏、负荷等时间序列数据的高精度回归预测任务;②为科研工作者提供可复现的多尺度集成ELM模型代码框架,支持快速算法验证与二次开发;③满足实际工程项目中对高效建模、实时预测与智能决策的技术需求。; 阅读建议:建议读者结合所提供的Matlab代码进行动手实践,深入理解多尺度特征构造与集成策略的设计思想,同时可参考文档中其他相关算法案例进行横向比较与综合应用,以提升整体科研创新能力。

精密钟表配件叉片插针组装机 -原创设计.rar

精密钟表配件叉片插针组装机 -原创设计.rar

精密制造基于桥式三坐标的深孔同轴度测量:半导体流体控制阀PTFE阀体形位公差定量检测方案

内容概要:本文针对高精密制造中深孔内部特征难以精确定量测量的技术瓶颈,提出了一套基于中图仪器Mars Classic 10128桥式三坐标测量机的解决方案,重点解决长径比大于5:1的PTFE四氟阀体深孔同轴度与圆柱度测量难题。通过采用自主研发的深孔加长测针组件与CP500S扫描测头,克服了传统接触式测针刚性不足和光学设备视场遮挡的问题,实现了对深孔内部形貌的连续扫描与三维拓扑建模,输出精度可达≤0.025mm,建立了可追溯、可量化的测量标准流程。; 适合人群:从事半导体流体控制阀、高精密PTFE阀体等零部件设计、制造与质量检测的工程技术人员及测试管理人员,具备一定几何公差与三坐标测量基础知识的专业人员; 使用场景及目标:①解决“影像仪测不到深孔内部”或“深孔长径比大于5怎么测”的实际工程问题;②实现对深孔同轴度、圆柱度等形位公差的定量评价,替代传统通止规定性判断;③为工艺优化、刀具补偿和质量追溯提供精准数据支持; 阅读建议:此资源作为技术应用指南,兼具设备选型参考与测量方法指导价值,建议结合实际检测案例对照操作,并联系中图仪器技术中心获取实测验证支持。

上一篇: 多线程 -- 信号量和互斥量
下一篇: 多线程 -- 关键段
tkp2014
博客等级 码龄12年 137粉丝 241原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值