线程共享进程中的哪些资源,线程之间如何共享?

考查重点:线程共享资源与私有状态。线程共享代码、堆和文件描述符,各自有寄存器、栈与线程本地状态;共享数据修改需锁或原子同步

本题目录

参考答案

核心回答

同一进程内的线程共享进程地址空间和大部分进程级资源,但各自保留运行所需的执行现场。常见的 Linux/POSIX 线程中,可以这样区分:

  • 共享的资源:代码、全局和静态数据、堆、内存映射区域,以及打开的文件描述符、Socket、工作目录等。信号处理方式等部分配置也属于进程级资源。
  • 各自的状态:程序计数器、寄存器、调用栈、线程 ID、线程本地存储,以及信号屏蔽字等线程级状态。
  • 共享的方式:线程使用同一个虚拟地址空间,可以通过全局变量、传入的指针或对象引用访问同一份数据,不必像不同进程那样先建立共享内存映射或通信通道。

但能访问同一份数据,不等于并发访问已经安全。共享可变状态通常还要配合锁、原子操作或线程安全队列,解决互斥、可见性和执行顺序问题。

进一步解释

父线程与子线程怎样共享?

这里的“父子”一般只是创建关系,新线程仍处于同一进程,不会因为被创建就复制出一份独立堆。

例如创建线程时,把一个任务对象的引用或指针传给它;创建者和工作线程拿到的是同一对象,就可以用它传递输入、记录结果。也可以把对象放到共享任务队列中,由工作线程取出处理。对象应在使用期间保持有效,多个线程对它的读写要遵守相应同步规则。

如果线程 A 更新计数器,线程 B 读取结果,不能只凭“它们共享堆”就认定结果正确。读改写可能相互覆盖,读取也可能缺少可见性保证。应根据需要选择原子计数、同一把锁保护的状态,或者在任务完成后通过受支持的等待机制取得结果。

栈是线程私有,为什么还可能被其他线程访问?

“私有栈”指每个线程有自己的栈区域和栈指针,保存各自的调用帧;它通常不是另一个受硬件隔离的地址空间。

在 C/C++ 等允许指针访问的环境中,把栈上对象的有效地址交给其他线程,对方可能访问该对象。此时必须保证对象生命周期和同步;原函数返回、对象已经失效后再访问,就可能出错。不能把“每个线程有栈”理解为“其他线程绝对无法碰到”。

Java 中也要区分局部变量与其引用的对象:两个线程各自的局部引用可以指向同一个堆对象。局部引用分别保存,并不会让目标对象自动变成两份。

文件描述符共享意味着什么?

在 POSIX 线程模型中,打开的文件描述符属于进程资源。例如一个线程打开 Socket,其他线程可以使用该描述符;一个线程关闭它,也会影响其他线程继续使用它。

因此,共享连接还要明确由谁读、谁写、谁关闭。共享资源表省去了重新建立连接的步骤,也带来了并发访问和生命周期管理责任。

常见追问

ThreadLocal 能让共享对象变成线程私有吗?

ThreadLocal 按线程保存值,适合隔离各线程的上下文;但如果给不同线程保存的是同一个可变对象引用,目标对象仍然共享。线程本地存储也不能代替跨线程传递结果所需的同步。

共享地址空间,为什么还会出现不可见或乱序?

地址空间决定访问哪份数据,语言和硬件的内存模型决定并发访问允许观察到什么。以 Java 为例,要通过锁、volatile、线程启动和终止等建立适用的 happens-before 关系。缓存一致性也不会自动把复合业务操作变成原子操作。

参考资料

  • 国内:JavaGuide:进程与线程详解:采用“线程共享什么,又私有什么”一节,整理地址空间、文件资源与栈、寄存器等执行状态的边界。
  • 国内:JavaGuide:Java 内存模型:采用共享变量与 happens-before 的解释,说明同一堆对象可访问与跨线程可见、原子执行之间的区别。
  • 国内:小林 coding:进程、线程基础知识:采用线程与进程比较、线程上下文切换两节,解释为什么线程能共享地址空间,又要分别保存执行现场。
  • 国外:Linux man-pages:pthreads(7):依据 POSIX 共享与线程私有属性,说明正文中文件描述符、工作目录和信号处理共享,而栈和信号屏蔽字分别维护的边界。
  • 国外:Microsoft:About Processes and Threads:依据共享虚拟地址空间和独立寄存器、栈及 TLS 的定义,补充正文中资源共享与执行上下文的区别。

相关面经

4 篇

字节跳动

搜广推引擎架构
一面
查看原面经 →
\- 线程之间共享地址空间,那么哪些内容是线程私有的?

去哪儿

AI 全栈开发工程师
校招
查看原面经 →
父线程子线程如何共享资源?

微步在线

Java 开发工程师
秋招一面
查看原面经 →
追问
它们共享和独享哪些资源?

字节跳动

后端开发工程师(AI / Agent 方向)
二面
查看原面经 →
线程会共享进程哪些资源?

相关题目

4 题