◎学完你会
- 分清进程(独立地址空间)与线程(共享地址空间);
- 知道 fork 创建进程、
std::thread 创建线程;
- 理解为什么"进程隔离更安全,线程共享更轻量"。
1进程独立内存,线程共享内存
进程有独立地址空间(彼此隔离),线程共享同一进程的地址空间(含全局数据)。
进程:独立内存、独立 PID
线程:共享内存、同进程内
2关键命令
| 写法 | 含义 |
fork() | Unix 创建子进程(复制父进程地址空间,返回两次) |
std::thread t(f); | 在同一进程内创建线程,共享内存(见 33.1) |
getpid() / getppid() | 取当前 / 父进程 PID |
ps / top | 查看系统进程 |
✅ 进程之间默认不共享数据(改不了对方的全局变量),要跨进程传数据得靠 IPC(见 34.4);线程天然共享,但要用锁防竞态(见 33.2)。
3进程 vs 线程:怎么选
| 维度 | 进程 | 线程 |
| 地址空间 | 独立 | 共享(同进程) |
| 隔离性 | 强(一方崩溃不影响其他进程) | 弱(线程崩溃常拖垮整个进程) |
| 开销 | 大(复制/独立资源) | 小(轻量) |
| 通信 | 需 IPC(管道/共享内存等) | 直接共享内存(需锁) |
| 创建 | fork() | std::thread |
经验:需要强隔离/可靠性(浏览器标签页、崩溃不影响主程序)用进程;需要高性能共享数据(高频协作计算)用线程,但务必处理好锁。
!易错点
① 以为线程间数据默认安全——共享是默认的,但无锁就会竞态。
② fork 后以为子进程能改父进程变量——进程地址空间独立,改的是各自的副本。
③ fork 在多线程程序里用——子进程只保留调用线程,易出问题,慎用。
④ 用进程做高频小任务——进程创建开销大,适合重型隔离任务。
?跨学科:进程与线程,像"独立房间"与"合租室友"
进程 像每个人住独立房间(独立地址空间):各用各的桌子、柜子,互不干扰,一人着火不影响别人(隔离强),但想借东西得走公共通道(IPC),且搬家成本高(开销大)。
线程 像同一套房合租的室友(共享地址空间):共用客厅和厨房(共享数据),沟通方便高效,但有人乱动公共东西(无锁竞态)就会吵起来(崩溃拖垮全屋)。选独立房间还是合租,看你要安全隔离还是高效共享。
✎练一练
关于进程,下列说法正确的是?
进程拥有独立地址空间、彼此隔离;要传数据须用 IPC(管道/共享内存等)。
与进程相比,线程的特点通常是?
线程共享地址空间、更轻量、通信高效,但共享需锁防竞态,隔离性弱于进程。
优先选进程而非线程的典型场景是?
需要强隔离/可靠(崩溃不影响其他部分)时用进程;高频共享数据或轻量任务更适合线程。