调用 fork 时是否复制线程?

35 c unix multithreading fork process

如果我有一个使用线程运行的程序并fork()在基于 unix 的系统上调用,线程是否被复制?我知道当前进程的虚拟内存以 1:1 的比例复制到生成的新进程中。我知道线程在进程的虚拟内存中有自己的堆栈。因此,至少也应该复制线程堆栈。但是,我不知道不驻留在虚拟内存中的线程是否还有其他内容,因此不会被复制。如果没有,这两个进程是共享线程还是独立的副本?

Jea*_*nès 31

不。

线程不在 上复制fork()。POSIX 规范说(强调是我的):

fork - 创建一个新进程

一个进程应使用单个线程创建。如果多线程进程调用 fork(),新进程应包含调用线程及其整个地址空间的副本,可能包括互斥锁和其他资源的状态。因此,为了避免错误,子进程可能只执行异步信号安全操作,直到调用 exec 函数之一。

为了规避这个问题,有一个pthread_atfork()功能可以提供帮助。


kay*_*lum 8

人叉

子进程是使用单个线程创建的 - 调用 fork() 的线程。父进程的整个虚拟地址空间在子进程中被复制,包括互斥锁、条件变量和其他pthreads对象的状态;使用 pthread_atfork(3) 可能有助于处理这可能导致的问题。

  • 您将获得整个内存空间 - 以及所有线程的堆栈。你需要它,因为对剩余线程可访问的堆栈(或静态内存)中的指针指向的位置没有限制 - 它们很可能指向原始进程中某个线程堆栈中的数据 (6认同)