Appearance
题目
在支持多线程的系统中,进程 P 创建的若干线程不能共享的是( )。
错因
A
代码段是只读共享的核心资源——所有线程都跑同一份代码,没必要复制多份。把代码段当成线程私有是没把"线程是为了共享资源才引入的"这条想清楚。
B
打开文件(fd 表)以进程为单位维护——同进程内所有线程共享同一份 fd 表,A 线程打开的 fd 在 B 线程也能用。这是线程共享的标志性资源之一。
C
全局变量在堆 / 数据段,进程级共享。线程间共享全局变量正是它们能高效协作的原因(也是要互斥保护的原因),不共享反而怪了。
总解析
引入线程的初衷:让同一进程内的多个执行流共享大部分资源、各自只持有最少的私有状态。
| 资源 | 同进程线程间是否共享 |
|---|---|
| 代码段 | ✓ 共享(都跑一份代码) |
| 数据段 / 全局变量 | ✓ 共享(堆、BSS) |
| 堆 | ✓ 共享(malloc 出来的内存) |
| 打开文件表 (fd) | ✓ 共享(进程级管理) |
| 信号处理 | ✓ 共享(按进程) |
| 当前工作目录、用户 ID 等 | ✓ 共享 |
| PC 程序计数器 | ✗ 私有(各线程在代码不同位置) |
| 栈 / 栈指针 | ✗ 私有(每线程一个独立栈) |
| 通用寄存器 | ✗ 私有(线程被切走时各自保存) |
| 线程局部存储 (TLS) | ✗ 私有 |
为什么栈必须私有:
栈用来存函数调用链 + 局部变量——每个线程都在独立执行函数(调用深度、局部变量值都不同),不能共用一个栈。栈指针 SP 指向当前线程栈的栈顶,自然也是每线程一份。
速记:线程共享"全局信息"(代码、数据、文件);私有"执行流信息"(PC、栈、寄存器)——前者是"程序的状态",后者是"执行到哪了",所以前者共、后者私。
逐项核对:
| 选项 | 描述 | 共享? |
|---|---|---|
| A | 代码段 | ✓ |
| B | 打开的文件 | ✓ |
| C | 全局变量 | ✓ |
| D | 某线程的栈指针 | ✗ 私有 |
最终答案是 D。