编程与 AI12 分钟阅读更新于 2026-08-04

线程是什么:与进程共享什么、独立什么

围绕线程、进程资源共享、独立寄存器与栈以及调度关系,解释线程为什么比进程更轻量。

相关工具

线程是进程中的一条执行流程

进程可以看成一次程序运行的整体,线程则是这个运行整体中的一条执行流程。相关基础内容 把线程称为轻量级线程,指出它是进程中的一个实体,也是程序执行的最小单位和系统独立调度、分配处理器的基本单位。

一个进程可以只有一条线程,也可以包含多条线程。多条线程可以分别推进不同的工作,例如一条线程等待输入输出,另一条线程继续处理已经准备好的数据。它们属于同一个进程,因此既有共同的资源,也有各自必须保存的运行状态。

一个进程包含多个线程并由线程承担执行流程的结构图
进程与线程的关系

进程提供整体资源边界,多个线程在同一进程中承担不同的执行流程。

同一进程中的线程共享哪些东西

同一进程中的线程可以共享代码段、数据段、打开的文件以及进程拥有的其他系统资源。共享这些内容后,线程之间传递数据和协作会更方便,不必像两个独立进程那样经过更复杂的跨进程通信。

共享也意味着一条线程的错误可能影响同一进程中的其他线程。如果多条线程同时修改同一份数据,就需要明确的同步规则;如果一条线程关闭了其他线程仍要使用的文件,整个进程的工作也可能受到影响。线程更轻量,往往正是因为它们共享了更多进程资源。

每条线程又必须保留自己的状态

线程共享进程资源,却不能共享同一份执行现场。每条线程都有自己的寄存器和栈,寄存器记录当前执行位置和计算状态,栈保存函数调用、局部变量以及返回信息。只有把这些内容分开保存,线程暂停后才能从自己的断点继续。

如果所有线程共用一套寄存器和栈,系统就无法区分它们分别执行到哪里,也无法在切换回来时恢复正确的调用关系。共享代码和数据提高协作效率,独立寄存器和栈则保证每条执行流程不会互相覆盖。

线程共享进程资源但保持独立寄存器和线程栈的示意图
线程的共享与独立

线程共享进程的代码、数据和文件资源,但各自拥有独立的寄存器与栈。

为什么线程切换通常比进程切换轻

进程拥有独立的地址空间和资源清单,切换到另一个进程时,系统需要处理更完整的运行环境变化。同一进程中的线程共享地址空间和大部分资源,线程切换主要保存和恢复当前线程的寄存器、栈等执行现场,因此通常比跨进程切换少一些工作。

这里的“轻量”不是没有成本。线程仍然需要被调度,也可能因为等待资源而阻塞;线程之间共享数据,还会引入锁、同步和竞态问题。选择线程并不是简单追求切换更快,而是用共享资源换取协作效率,同时承担更强的相互影响。

Linux 如何理解进程和线程

这里介绍 Linux 时提到,Linux 内核并不把进程和线程看成完全不同的内核对象,二者底层都可以通过 clone 机制创建。是否复制地址空间,决定了创建结果更接近独立进程还是共享资源的线程。

在使用层面,人们通常通过进程和线程的接口区分两种组织方式;在内核层面,关键差别是地址空间、文件和其他资源是否共享。理解这一点后,就能看出“线程是轻量级进程”这个说法的由来:它们都需要被调度和管理,但线程通常依附于进程的资源环境。

线程如何带来并发

同一进程中的多个线程可以并发执行。单个处理核心会在多个线程之间快速切换,让它们在同一时间间隔内交替推进;多个处理核心则可以让不同线程在同一时刻真正并行。操作系统负责调度线程,但线程之间如何分工仍取决于任务本身。

当一条线程等待磁盘或网络时,其他线程可以继续处理已经准备好的工作;当任务适合拆成多个相互独立的部分时,多条线程也可以分担计算。不过,线程数量增加后,切换、同步和共享数据的成本也会增加,并不是线程越多就一定越快。

操作系统调度多个线程并在单核或多核上形成并发执行的示意图
线程并发与处理器调度

操作系统在多个线程之间分配处理器时间,单核体现为交替推进,多核可以同时运行。

共享资源为什么需要同步

假设两条线程同时给同一个计数值加一。它们可能先后读到相同的旧值,再分别写回结果,最终只增加一次。问题不在于加法本身,而在于读取、修改和写回之间发生了交错,导致其中一次更新被覆盖。

共享数据需要同步机制来规定访问顺序,让应该连续完成的操作不会被另一条线程插入。同步可以减少竞态,但也会带来等待;如果多个线程互相等待对方释放资源,还可能形成死锁。因此,线程设计既要考虑如何共享,也要考虑共享边界和访问顺序。

进程和线程应该怎样选择

需要强隔离时,独立进程更合适。一个进程崩溃时,通常不会直接覆盖另一个进程的地址空间;不同进程之间的资源边界也更清晰。需要在同一份数据上高频协作时,多线程更方便,但必须认真处理共享数据和同步。

可以用三个问题做初步判断:任务之间是否需要共享大量内存,任务出错时是否需要相互隔离,任务是否需要频繁交换数据。如果更看重隔离,倾向于进程;如果更看重共享和协作,倾向于线程。最终还要结合任务规模、等待类型和系统资源综合判断。

用一句话记住线程

线程是进程中的执行流程:它共享进程拥有的代码、数据和文件资源,却保留自己的寄存器、栈和执行现场。操作系统独立调度线程,让它们可以并发推进;进程则为这些线程提供资源边界和整体运行环境。

抓住“共享资源、独立现场、独立调度”这三个关键词,后续学习线程池、锁、信号量、条件变量和 I/O 多路复用时,就能知道它们分别在解决什么问题:是减少线程创建成本,保护共享数据,还是让线程在等待时不浪费处理器。

常见问题

线程和进程最大的区别是什么?

进程通常拥有独立的地址空间和资源边界,线程属于进程并共享进程的大部分资源,但每条线程拥有独立的寄存器和栈。

线程共享资源是不是一定更好?

不一定。共享可以提高协作效率,但也会带来竞态、同步和死锁风险,需要根据隔离要求和任务协作方式选择。

线程数量越多,程序运行越快吗?

不一定。线程过多会增加调度、切换和同步成本,只有任务能够有效并行且资源足够时,增加线程才可能带来收益。