Linux下多线程

embedded/2024/11/24 8:10:10/

在Linux下的底层里并没有多线程这个概念,取而代之的是轻量级进程的概念。应为在Llinu下内核下并没有TCB,而只有PCB。

线程是什么

在⼀个程序⾥的⼀个执⾏路线就叫做线程(thread)。更准确的定义是:线程是“⼀个进程内部
的控制序列”
• ⼀切进程⾄少都有⼀个执⾏线程
• 线程在进程内部运⾏,本质是在进程地址空间内运⾏
• 在Linux系统中,在CPU眼中,看到的PCB都要⽐传统的进程更加轻量化
• 透过进程虚拟地址空间,可以看到进程的⼤部分资源,将进程资源合理分配给每个执⾏流,就形
成了线程执⾏流

总结一下就是,我们的进程是包括了所有pcb,所拥有的物理内存,以及页表等,综合下来组成的叫做进程。而线程是分配一个PCB,用来执行自己代码的轻量级进程。

线程的优点

• 创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多
• 与进程之间的切换相⽐,线程之间的切换需要操作系统做的⼯作要少很多
1. 最主要的区别是线程的切换虚拟内存空间依然是相同的,但是进程切换是不同的。这两种上
下⽂切换的处理都是通过操作系统内核来完成的。内核的这种切换过程伴随的最显著的性能
损耗是将寄存器中的内容切换出。
2.另外⼀个隐藏的损耗是上下⽂的切换会扰乱处理器的缓存机制。简单的说,⼀旦去切换上下
⽂,处理器中所有已经缓存的内存地址⼀瞬间都作废了。还有⼀个显著的区别是当你改变虚
拟内存空间的时候,处理的⻚表缓冲 TLB (快表)会被全部刷新,这将导致内存的访问在⼀
段时间内相当的低效。但是在线程的切换中,不会出现这个问题,当然还有硬件cache。
• 线程占⽤的资源要⽐进程少很
• 能充分利⽤多处理器的可并⾏数量
• 在等待慢速I/O操作结束的同时,程序可执⾏其他的计算任务
• 计算密集型应⽤,为了能在多处理器系统上运⾏,将计算分解到多个线程中实现
• I/O密集型应⽤,为了提⾼性能,将I/O操作重叠。线程可以同时等待不同的I/O操作。

线程的缺点

•性能损失
⼀个很少被外部事件阻塞的计算密集型线程往往⽆法与其它线程共享同⼀个处理器。如果计
算密集型线程的数量⽐可⽤的处理器多,那么可能会有较⼤的性能损失,这⾥的性能损失指
的是增加了额外的同步和调度开销,⽽可⽤的资源不变。
• 健壮性降低
 编写多线程需要更全⾯更深⼊的考虑,在⼀个多线程程序⾥,因时间分配上的细微偏差或者
因共享了不该共享的变量⽽造成不良影响的可能性是很⼤的,换句话说线程之间是缺乏保护
的。
• 缺乏访问控制
 进程是访问控制的基本粒度,在⼀个线程中调⽤某些OS函数会对整个进程造成影响。

 Linux线程控制

3-1POSIX线程库

• 与线程有关的函数构成了⼀个完整的系列,绝⼤多数函数的名字都是以“pthread_”打头的
• 要使⽤这些函数库,要通过引⼊头⽂ <pthread.h>
• 链接这些线程函数库时要使⽤编译器命令的“-lpthread”选项

线程创建


线程终⽌

1. 从线程函数return。这种⽅法对主线程不适⽤,从main函数return相当于调⽤exit。
2. 线程可以调⽤pthread_exit终⽌⾃⼰。
3. ⼀个线程可以调⽤pthread_cancel终⽌同⼀进程中的另⼀个线程。

pthread_exit

pthread_cancel

线程等待

为什么需要线程等待?
已经退出的线程,其空间没有被释放,仍然在进程的地址空间内

调⽤该函数的线程将挂起等待,直到id为thread的线程终⽌。thread线程以不同的⽅法终⽌,通过
pthread_join得到的终⽌状态是不同的,总结如下:

1. 如果thread线程通过return返回,value_ptr所指向的单元⾥存放的是thread线程函数的返回值。
2. 如果thread线程被别的线程调⽤pthread_cancel异常终掉,value_ptr所指向的单元⾥存放的是常
数PTHREAD_CANCELED。比特就业课
3. 如果thread线程是⾃⼰调⽤pthread_exit终⽌的,value_ptr所指向的单元存放的是传给pthread_exit的参数。
4. 如果对thread线程的终⽌状态不感兴趣,可以传NULL给value_ptr参数。

分离线程

• 默认情况下,新创建的线程是joinable的,线程退出后,需要对其进⾏pthread_join操作,否则
⽆法释放资源,从⽽造成系统泄漏。
• 如果不关⼼线程的返回值,join是⼀种负担,这个时候,我们可以告诉系统,当线程退出时,⾃
动释放线程资源。


http://www.ppmy.cn/embedded/139383.html

相关文章

【Git从入门到精通】——Git分支介绍与GitHub相关知识总结

&#x1f3bc;个人主页&#xff1a;【Y小夜】 &#x1f60e;作者简介&#xff1a;一位双非学校的大二学生&#xff0c;编程爱好者&#xff0c; 专注于基础和实战分享&#xff0c;欢迎私信咨询&#xff01; &#x1f386;入门专栏&#xff1a;&#x1f387;【MySQL&#xff0…

C++中的组合模式

组合模式&#xff08;Composite Pattern&#xff09; 组合模式是一种结构型设计模式&#xff0c;它将对象组合成树形结构以表示“部分-整体”的层次结构。组合模式使得客户端可以统一地处理单个对象和对象组合。这个模式特别适用于需要表示层次结构的场景&#xff0c;例如文件…

用Python“拍立淘”:在1688的海洋里寻找宝藏

想象一下&#xff0c;你是一名勇敢的探险家&#xff0c;手持一张神秘的藏宝图&#xff0c;准备在阿里巴巴的1688海洋中寻找那些隐藏的宝贝。但这次&#xff0c;你的武器不是传统的铲子和罗盘&#xff0c;而是Python爬虫。我们将一起编写一段代码&#xff0c;让它成为我们的“拍…

C++小白实习日记——Day 5 gitee怎么删文件,测试文件怎么写循环

昨晚一直内耗&#xff0c;一个程序写了三天写不出来&#xff0c;主要是耗时太多了&#xff0c;老板一直不满意。想在VScode上跑一下&#xff0c;昨晚一直报错。今天来公司重新搞了一下&#xff0c; 主要工作有&#xff1a; 1&#xff0c;读取当前时间用tscns 2&#xff0c;输…

Java项目实战II基于微信小程序的课堂助手(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 在数字化教…

MySQL 架构概览

show processlist;命令查询所有正在运行的线程 MySql架构从上到下分为网络连接层&#xff0c;系统服务层&#xff0c;存储引擎层&#xff0c;文件系统层 1.网络连接层主要负责维护客户端的连接&#xff0c;保存session会话&#xff0c;以及多线程下的连接管理。 2.系统服务层…

【Vim/Vi/Gvim操作】:列操作

文章目录 列操作1. 列选择模式1.1 visual 模式1.2 visual line模式1.3 visual block模式 2.列操作2.1 行首插入操作2.2 替换操作 列操作 1. 列选择模式 1.1 visual 模式 命令行状态下按下小写v&#xff0c;默认进入到visual模式&#xff0c;该模式相当于在window中按下鼠标左…

经典面试力扣392判断子序列

给定字符串s和t&#xff0c;判断s是否为t的子序列。 字符串的一个子序列是原始字符串删除一些(也可以不删除&#xff09; 字符而不改变剩余字符相对位置形成的新字符串。 (例如&#xff0c;"ace"是"abcde"的一个子序列&#xff0c;而"aec"不是)。…