线程理论篇1

本章问题:什么是线程?线程的使用场景?什么是线程池?线程池是如何工作的?线程池共享了哪些资源?线程安全代码怎么写?什么是线程安全?

什么是线程?

线程是为了提高进程的效率。进程的地址空间中保存了cpu执行的机器指令以及函数运行时的堆栈信息,要想让程序运行起来,就要不拿main函数的第一条机器指令地址写入pc寄存器,从而形成一个指令的执行流。

进程的缺点在于只有一个入口函数,就是main()函数。因此进程中的机器指令一次只能被一个cpu执行,有没有办法让多个cpu执行同一个进程中的机器指令呢?

当然,pc寄存器既然可以指向main()函数,也可以指向其他函数,从而创建一个新的执行流。

至此,一个进程内可以有多个入口函数,也就是一个进程存在多个执行流。

更关键的是,这些执行流共享同一个进程地址空间,因此也不再需要进程间通信了。

对于每一条执行流,我们都称其为“线程”。

多线程与内存布局

函数在执行时依赖的信息包括函数参数局部变量返回地址等信息,这些信息都被保存在相应的栈帧中。每个函数在运行时都有自己的栈帧,随着函数的调用,以及返回,这些栈帧按照先进后出的顺序增长或减少。栈帧的增长或减少形成地址进程空间中的栈区

在线程这个概念没有出现时,一个进程中只有一个执行流,因此只有一个栈区,现在有了线程之后就有了多个执行流,每个执行流都要有自己的栈区

言而总之,想说的就是创建线程是要消耗进程内存看空间的,这一点值得注意。

线程的使用场景(引出线程池的概念)

从生命周期来看,线程要处理的任务有两种:长任务,短任务。

对于长任务没有什么好说的。收到哦一个请求就创建一个线程来处理任务,处理完成之后销毁该栈帧即可。

对于短任务来说,短任务的生命周期短,如一次网络请求一次数据库查询等。这类任务往往判断着一个特点:量大。

(1)对于每次收到一个短任务就创建一个线程,等周期结束再消耗栈帧,必然会消耗大量的时间。(线程的创建和销毁是会消耗时间的)

(2)每个线程都有独立的栈区,当创建大量线程时会消耗过多的内存。

(3)大量线程会使线程的切换开销增加。

因此我们可以提前创建一批线程,有任务就交给做这些线程进行处理。不需要频繁的创建,销毁,没任务就让这些线程的任务队列中阻塞等待。

线程池是如何工作的?

有了任务,有了线程,有了线程池,怎么把任务提交给线程池中的线程呢?

我们用数据结构中的队列来维护线程池。

在没有任务的时候线程池中的线程会在任务队列中阻塞等待,当生产者向任务队列中写入数据课后,线程池中的某个线程会被唤醒,该线程会从任务队列中取出上述结构体并执行该结构体中handle指向的处理函数:

线程到底共享了哪些进程资源?

在讨论线程共享了哪些资源前我们先想想线程都有哪些资源。

线程其实就是函数的执行,那么函数的执行都有哪些信息呢?

函数在运行时信息保存在栈帧中,栈帧组成了栈区,栈帧中保存了函数的返回值调用其他函数的参数该函数使用的局部变量该函数适用的寄存器信息等。

所属线程的栈区,栈指针,程序计数器,以及执行函数时使用的寄存器信息都是线程私有的。

剩下的堆区,数据区,代码区都是共享的:



 

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【mysql】mysql单表查询、多表查询、分组查询、子查询等案例详细解析

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,…

嵌入式C语言高级教程:实现基于STM32的人工智能语音识别系统

在嵌入式系统中实现语音识别技术可以极大地增强设备的交互性。本教程将指导您如何在STM32微控制器上使用TensorFlow Lite for Microcontrollers实现基本的语音识别功能。 一、开发环境准备 硬件要求 微控制器:STM32F746NG,支持足够的运算能力和内存来…

spring高级篇(七)

1、异常处理 在DispatcherServlet中,doDispatch(HttpServletRequest request, HttpServletResponse response) 方法用于进行任务处理: 在捕获到异常后没有立刻进行处理,而是先用一个局部变量dispatchException进行记录,然后统一由…

VMware虚拟机中ubuntu使用记录(5)—— 如何在ubuntu中安装USB相机ros驱动并获取usb摄像头数据

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一、ROS下USB相机驱动1.准备工作(1) 下载驱动(2) 创建ROS工作空间 2. 安装usb_cam驱动(1) 安装usb_cam驱动包(2) 编译代码 3. 修改usb_cam驱动的配置文件(1) 查看US…

一路串联电机的绕制原理

这里要说明的一点是 对于一路串联的电机,无论是一把线圈还是两把线圈,出来的都是只有两个线头,可看做一个整体来对待! 绕制具体原理 同心式线圈绕制 前面说的都是等距式的 线圈绕制,下面我们讲解一下同心式的绕制办法…

##07 从线性回归到神经网络:PyTorch实战解析

文章目录 前言线性回归基础理论背景实现步骤 神经网络介绍理论背景实现步骤 从线性回归到神经网络结论 前言 在深度学习的浩瀚宇宙中,线性回归和神经网络是两个基本但极其重要的概念。线性回归模型是统计学和机器学习的基石之一,而神经网络则是深度学习…

大模型能提高工作效率吗?

大模型可以通过多种方式提高办公效率,尤其是在处理信息和数据方面。 下是一些具体的应用场景: 自动化文档处理: 大模型可以自动处理文档,包括阅读、理解和总结长篇文章或报告,以及自动生成摘要或关键点。 自然语言生…

[开发|鸿蒙] DevEco Studio编译构建(笔记,持续更新)

构建体系 编译构建是将应用/服务的源代码、资源、第三方库等,通过编译工具转换为可直接在硬件设备上运行的二进制机器码,然后再将二进制机器码封装为HAP/APP软件包,并为HAP/APP包进行签名的过程。其中,HAP是可以直接运行在模拟器…

C++算法题 - 二叉树(2)

TOC 114. 二叉树展开为链表 LeetCode_link 给你二叉树的根结点 root ,请你将它展开为一个单链表: 展开后的单链表应该同样使用 TreeNode ,其中 right 子指针指向链表中下一个结点,而左子指针始终为 null 。展开后的单链表应该与…

2024年全国五大数学建模竞赛Top榜及难度分析!推荐数维杯!!!

发现最近许多同学都陆续开始准备今年的数学建模竞赛了,但是随着数学建模领域越来越普及,影响力越来越广泛,参加的同学也越来越多,就导致有越来越多各式各样的数学建模竞赛此起彼伏出现,但其中有一些竞赛其实并不值得参…

如何用Jmeter压测

推荐你阅读 互联网大厂万字专题总结 Redis总结 JUC总结 操作系统总结 JVM总结 Mysql总结 微服务总结 互联网大厂常考知识点 什么是系统调用 CPU底层锁指令有哪些 AQS与ReentrantLock原理 旁路策略缓存一致性 Java通配符看这一篇就够 Java自限定泛型 技术分享 如何vscode中刷力扣…

考研管理类联考(专业代码199)数学基础【3】函数、方程、不等式

一、函数 1.一次函数 y kx b(k≠0) 的图象及性质 2.二次函数y ax^2 bx c的图象和性质 3.指数函数y a^x ( a>0,且a≠1)的图象和性质 4.对数函数y logₐx ( a>0,且a≠1)的图象与性质 二、方程 1.一元…

Git系列:git merge 使用技巧

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」…

产品评测:SmartX 与 Nutanix 超融合在数据库场景下的性能表现

重点内容 SmartX 与 Nutanix 超融合分布式存储设计差异如何影响数据库性能表现。重点测试结论:数据库场景下,SmartX 超融合基于单卷部署的性能,依旧优于 Nutanix 超融合基于多卷部署最佳配置的性能。更多 SmartX、VMware、Nutanix 超融合技术…

50kw 直流充电桩测试仪的基础知识

直流充电桩测试仪是专门用于检测和测试直流充电桩性能的设备。它能够对充电桩的输出电压、电流、功率、效率等关键参数进行精确测量,以确保充电桩的正常运行和充电安全。 一、工作原理 直流充电桩测试仪主要通过模拟实际充电过程,对充电桩的各项性能进行…

测试台架设计与制作

技术改变生活,懒人推动科技。人们在执行整车测试时,诸多不便,那如何提高测试效率、改善人员测试环境,各个汽车生态的设计者就为之费神。以CarPlay为例,从2013年的送整车去美国测试,发展到如今所有测试均可在…

2024年,抖音小店开通需要多少钱?一篇详解!

大家好,我是电商糖果 2024年了,想在抖音开店卖货的朋友越来越多。 主要原因还是看到,这几年在抖音上赚到钱的人越来越多。 于是大家在今年比较关心的问题,就是抖音小店开通需要多少钱? 糖果做抖音小店四年了&#…

ESP32S3各个管脚使用需要注意的情况说明:

想使用ESP32S3做个控制电路,管脚使用情况自己整理了一下,记录一下,免得后面又忘记了,有不对之处望帮助更正: IO0和IO46先要说明一下:以前只注意IO0是启动刷机的时候用的,低电平时启动是串口刷机…

如何查看打包后的jar包启动方法

背景 有时候我们在引用一个jar包的时候,想查看一个jar包的结构,这时候查看启动类就比较重要,因为一些关键配置是在启动类上的,这里教大家如何查看这个启动类(springboot项目) 步骤 首先打开jar包预览结构,可以使用解压缩工具直接双击打开或者预览结构 打开路径 META-INF/MA…

使用公有云主机部署ftp服务被动模式(centos操作系统)

文章目录 前言一、FTP服务搭建1.1 部署服务1.2 修改配置文件1.3 重启服务1.3 配置项解答 二、安全组设置访问规则2.1配置监听端口2.2 配置数据端口三、使用ftp登陆工具测试3.1 使用工具进行测试 总结 前言 使用公有云上的云主机搭建FTP服务器。 步骤思路: 1、云主机…