线程是否可共享栈?初始化后线程间是否完全并行独立?
线程创建与资源共享相关问题解答
子线程是否存储在创建它的父线程栈中?
这个假设是完全错误的。
你在某个线程的执行逻辑里调用线程创建API(比如类Unix系统的pthread_create、Windows系统的CreateThread),仅仅是指「创建线程的动作发生在父线程的执行流里」,绝不代表新线程本身的存储落在父线程的栈空间中。
每个被成功创建的线程,都会被操作系统或线程运行库分配独立的专属内存区域:包括独立的线程控制块(TCB)、独立的执行栈、独立的寄存器上下文存储区,这些内存和父线程的栈空间完全隔离。父线程的栈里最多只会存储创建API返回的线程ID/线程句柄这类小的标识值——这和你在函数里调用open打开文件,文件本身不会存在当前函数栈里是同一个逻辑。
线程初始化完成后是否完全并行独立?
这个说法半对半错,不存在绝对的“完全独立”。
- 从调度执行的层面看:新线程完成初始化进入就绪队列后,和父线程是完全平等的独立调度单元,操作系统调度器会按照统一策略给它们分配CPU时间片,二者可以在不同CPU核心上真正并行执行,不存在逻辑上的依附关系——只要进程没有整体退出,哪怕创建它的父线程先执行结束,子线程也可以正常继续运行。
- 从资源隔离的层面看:同一个进程下的所有线程天生共享进程级的公共资源,根本做不到完全的独立隔离,一个线程修改了共享资源,其他线程都能直接感知到变化。
除堆之外线程间的共享资源
同一个进程内的线程,除了共享堆内存之外,还会共享以下进程级资源:
- 进程的代码段:所有线程都可以直接执行进程加载的可执行程序代码、动态链接库代码
- 全局/静态数据区:存储全局变量、static修饰的静态变量的内存区域,所有线程可直接读写
- 内核持有的进程级资源:包括进程打开的所有文件描述符、socket套接字、共享内存映射、信号处理函数的注册配置、进程当前工作目录、进程的用户/组权限信息
- 进程虚拟地址空间中,非线程私有的所有内存映射区域
补充说明:线程私有的资源仅包含自身的执行栈、寄存器上下文、线程局部存储(TLS)、独立的信号掩码、线程自身的调度优先级属性这几类,其余进程持有的资源基本都是所有线程共享的。
内容的提问来源于stack exchange,提问作者Lucas
相关产品推荐
相关产品推荐

