Linux下多线程

在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得到的终⽌状态是不同的,总结如下:

bash 复制代码
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是⼀种负担,这个时候,我们可以告诉系统,当线程退出时,⾃

动释放线程资源。

相关推荐
MC皮蛋侠客3 分钟前
distcc结合VSCode实现分布式编译的全面指南
c++·ide·分布式·vscode
西格电力科技9 分钟前
绿电直连架构适配技术的发展趋势
大数据·服务器·数据库·架构·能源
有味道的男人10 分钟前
1688数据采集:官方API与网页爬虫实战指南
java·服务器·爬虫
天赐学c语言16 分钟前
12.20 - 反转链表II && 传值和传地址的区别
数据结构·c++·算法·链表·leecode
SELSL17 分钟前
标准IO总结
linux·c语言·标准io·stdio·标准io与文件io的区别
_OP_CHEN18 分钟前
【算法基础篇】(三十六)图论基础之拓扑排序:从原理到实战,搞定 DAG 图的 “先后次序” 难题
c++·算法·蓝桥杯·图论·拓扑排序·算法竞赛·acm/icpc
爱尔兰极光19 分钟前
计算机网络--IPv4地址
服务器·网络·计算机网络
大猫和小黄20 分钟前
Ubuntu环境下GitBlit安装部署与版本库迁移
linux·运维·git·ubuntu·gitblit
郝学胜-神的一滴29 分钟前
使用EBO绘制图形:解锁高效渲染与内存节省之道
c++·qt·游戏·设计模式·系统架构·图形渲染
点亮一颗LED(从入门到放弃)31 分钟前
设备树驱动(6)
linux