← SEARCHABLE ARCHIVE
Operating System · 2026-07-14

什么是线程?

进程内实际执行代码的流程

INTERACTIVE READING MODE →

该博客上撰写的文章是出于教学目的而创建的。 另外,文章中的信息可能不正确,请谨慎。

如果进程是保存内存和文件等资源的容器,那么线程就是在其中实际执行命令的流。

创建进程时,通常会启动一个主线程,如果需要,还可以创建其他线程。

同一进程中的线程共享资源

属于同一进程的线程共享代码、全局数据、堆和打开的文件。 相反,每个线程都有自己的堆栈、寄存器状态和执行位置。

一个过程
┌──────────────────────────┐
│ 代码/数据/堆共享 │
├────────────┬─────────────┤
│ Thread A   │ Thread B    │
│ Stack A    │ Stack B     │
│ Register A │ Register B  │
└────────────┴─────────────┘

两个线程可以使用同一个对象的地址的原因是因为它们共享堆。 另一方面,函数的局部变量基本上是在每个线程的堆栈上创建的,因此它们是相互分离的。

为什么要使用线程?

例如,在游戏中,工作线程可以执行路径导航或资源加载,而主线程处理输入和屏幕更新。 如果您有多个 CPU 核心,则不同的线程实际上可能会同时运行。

std::thread worker([]()
{
    LoadResources();
});

UpdateGame();
worker.join();

join()导致当前线程等待,直到工作线程完成。

进程和线程之间的区别

进程在内存中基本是隔离的,一个进程的问题很难直接波及到其他进程。 但发电和通信成本较大。

由于线程共享相同的内存,因此很容易交换数据并且相对轻量级。 相反,不正确的指针访问或同步错误可能会破坏整个同一进程。

进程:资源所有权和隔离的单位
线程:CPU执行流程的单位

拥有更多线程并不一定会使事情变得更快。 如果划分任务、等待锁、缓存冲突和上下文切换的成本超过了计算收益,它实际上会减慢速度。