线程理论篇1

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

什么是线程?

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

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

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

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

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

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

多线程与内存布局

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

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

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

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

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

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

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

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

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

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

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

线程池是如何工作的?

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

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

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

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

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

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

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

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

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

共享资源

代码区

代码区保存的是程序员写的代码,更准确的是编译后生成的可执行机器指令。

这些机器指令被存放在可执行程序中,程序启动时加载到进程的地址空间中。

线程之间共享代码区。

注意:

代码区只是只读的 ,任何线程在程序运行期间都不能修改代码区。

原因:

为了线程安全。


数据区

数据区存放全局变量。

所有线程都可以共享该全局变量。
 

堆区

只要知道变量的地址(指针),任何一个线程都可以访问指针指向的数据。

栈区

我们前面说栈区是线程的私有区,为什么这里又说栈区可以被线程共享呢?

首先我们要知道前面说的栈区是私有的是针对不同进程的线程之间来说的。因为不同进程的地址空间是相互隔离的,没有办法直接访问属于另一个进程地址空间中的数据。但是同一个进程的不同线程之间没有这种保护,因为一个线程可以访问另一个线程的栈区。

线程安全的代码到底是怎么编写的?

线程使用自己的私有资源,能实现线程安全。

线程使用共享资源,必须要保证不影响其他线程。

什么是线程安全?

 

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

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

相关文章

软件合规 安全可控 | 企业软件合规化管理方案

软件合规,安全可控,这是当下企业运营中不可或缺的两个关键词。随着信息技术的迅猛发展,企业对于软件的需求与日俱增,然而,如何确保软件的合规性和安全性,却成为了摆在企业面前的一大难题。Ping32企业软件合…

WinForm中防页面假死的loading提示

如果在WinForm中执行一个长时间操作时,窗体就会被锁死,直到操作完成,对于操作者的体验就是死锁状态,那在.NET(.net 5以后)中,怎么实现一个并发,等待,且同步操作信息窗口呢…

【接地故障保护】剩余电流继电器及监控产品解决方案

安科瑞电气股份有限公司 祁洁 15000363176 一、产品型号 二、产品功能 1、对直接接触电击事故的防护 对直接接触电击事故的防护中,剩余电流继电器(RCD)只作为直接接触电击事故基本防护措施的补充保护措施(不包括对相与相、相…

使用Linux命令时,前面加sudo和不加有什么区别?

在使用cmake命令编译时,前面加上sudo和不加主要有以下区别: 权限: 使用sudo:当您在命令前加上sudo时,表示您以超级用户的权限执行该命令。这通常用于需要访问受限制的系统文件或执行需要更高权限的操作。不使用sudo&am…

Java面试八股文(MySQL篇)

数据库三范式 数据库事务介绍 索引介绍 SQL优化手段 mysql union 与 union all 语法及用法 并发事务带来的问题 大表如何优化 索引类型介绍 MYSQL数据库锁介绍

数据库数据恢复—SQL Server数据库ndf文件变为0KB的数据恢复案例

SQL Server数据库故障: 存储设备损坏导致存储中SQL Server数据库崩溃。对数据库文件进行恢复后,用户发现有4个ndf文件的大小变为0KB。该SQL Server数据库每10天生成一个大小相同的NDF文件,该SQL Server数据库包含两个LDF文件。 SQL Server数据…

2024年数维杯数学建模B题思路

文章目录 1 赛题思路2 比赛日期和时间3 竞赛信息4 建模常见问题类型4.1 分类问题4.2 优化问题4.3 预测问题4.4 评价问题 5 建模资料 1 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 2 比赛日期和时间 报名截止时间:2024…

带你快速掌握Spring Task

Spring Task ⭐Spring Task 是Spirng框架提供的任务调度工具,可以按照约定的时间自动执行某个代码逻辑 📌一款定时任务框架 应用场景 信用卡信息银行贷款信息火车票信息 只要是需要定时处理的场景都可以使用Spring Task 只要有定时,就会有…

语言模型测试系列【7】

语言模型 文心一言星火认知大模型通义千问豆包360智脑百川大模型腾讯混元助手Kimi Chat商量C知道 今天看CSDN文章,看到了斐波那契数列这个有趣的数列计算,然后就在文心一言中对答了一波,给的答案很完整,而且给出来python的实现代…

刷题之不相同的字符串(卡码网模拟)

卡码网不同的字符串 #include<vector> #include<string> #include<iostream> using namespace std; int main() {int n0;cin>>n;for(int i0;i<n;i){string s;cin>>s;vector<int>hash(26,0);for(int j 0;j < s.size();j)hash[s[j…

Oracle SQL Developer导出数据库表结构,表数据,索引以及序列号等对象

通过Oracle SQL Developer软件将指定oralce数据库中的表结构&#xff0c;表数据&#xff0c;索引以及序列号等对象导出成SQL文件。 数据库版本&#xff1a;Oracle Database 11g Express Edition Release 11.2.0.2.0 - 64bit Production 软件版本&#xff1a;Oracle SQL Develo…

MySQL数据库及数据表的创建

1.创建一个名叫 db_classes 的数据库&#xff1a; 创建一个叫 db_classes 的数据库MySQL命令&#xff1a; create database db_classes; 运行效果&#xff1a; 创建数据库后查看该数据库基本信息MySQL命令&#xff1a; show create database db_classes; 运行效果&#xff…

智慧旅游推动旅游服务智慧化转型:借助智能科技的力量,实现旅游资源的精准匹配和高效利用,为游客提供更加便捷、舒适的旅游环境

目录 一、引言 二、智慧旅游的定义与特点 &#xff08;一&#xff09;智慧旅游的定义 &#xff08;二&#xff09;智慧旅游的特点 三、智能科技在旅游服务中的应用 &#xff08;一&#xff09;大数据分析助力旅游决策 &#xff08;二&#xff09;人工智能实现个性化推荐…

硬件设计——滤波器设计_MIC用有源带通滤波器

“在已有的成熟稳定的滤波器基础上&#xff0c;根据业务需要对原设计进行优化调整以得到新的滤波器” 是滤波器设计的一种常用方法。 MIC用有源带通滤波器 介绍一种简单直观的带通滤波器以及计算过程&#xff0c;以作未来可参考的基线设计。该滤波器可用于音频信号&#xff0…

Layer1 公链竞争破局者:Sui 生态的全面创新之路

随着 Sui 生态逐渐在全球范围内树立起声望&#xff0c;并通过与 Revolut 等前沿金融科技平台合作&#xff0c;推广区块链教育与应用&#xff0c;Sui 生态的未来发展方向已成为业界瞩目的焦点。如今&#xff0c;Sui 的总锁定价值已攀升至 5.93 亿美元&#xff0c;充分展示了其在…

idea配置hive

idea配置hive 今天才知道&#xff0c;idea居然可以配置hive&#xff0c;步骤如下: view -> Tool Windows -> Database Database出来了之后&#xff0c;直接配置即可

react【实用教程】 搭建开发环境(2024版)Vite+React (官方推荐)

以项目名 reactDemo为例 1. 下载脚手架 在目标文件夹中打开命令行 npm create vite2. 安装项目依赖 cd reactDemo npm i若安装失败&#xff0c;则修改下载源重试 npm config set registry https://registry.npmmirror.com3. 启动项目 npm run dev4. 预览项目 浏览器访问 http…

特斯拉擎天柱机器人:工厂自动化的未来

随着技术的进步&#xff0c;工业自动化已经逐步进入了一个新的纪元。特斯拉最近公布的擎天柱机器人Optimus的演示&#xff0c;不仅仅展示了一个高科技机器人的能力&#xff0c;更是向我们揭示了未来工厂的可能性。 特斯拉擎天柱机器人的功能展示 马斯克在最新的演示中向我们展…

【自然语言处理】seq2seq模型——机器翻译

seq2seq模型——机器翻译 1 任务目标 1.1 案例简介 seq2seq是神经机器翻译的主流框架&#xff0c;如今的商用机器翻译系统大多都基于其构建&#xff0c;在本案例中&#xff0c;我们将使用由NIST提供的中英文本数据训练一个简单的中英翻译系统&#xff0c;在实践中学习seq2se…

深度解读《深度探索C++对象模型》之C++的临时对象(二)

目录 临时对象的生命期 特殊的情况 接下来我将持续更新“深度解读《深度探索C对象模型》”系列&#xff0c;敬请期待&#xff0c;欢迎左下角点击关注&#xff01;也可以关注公众号&#xff1a;iShare爱分享&#xff0c;或文章末尾扫描二维码&#xff0c;自动获得推文和全部的…