fork和现有线程?

Mac*_*c13 14 c unix multithreading fork

在Linux系统上,子进程是否以与父进程相同的方式查看现有线程?

int main() {

  //create thread 1

  int child_pid = fork();

  if ( 0 == child_pid)
  {
       ..
  }
  else
  {
       ..
  }
Run Code Online (Sandbox Code Playgroud)

由于为子进程复制了整个地址空间,因此线程的状态会发生什么.如果上段中的线程1正在等待条件信号,该怎么办?是否在儿童过程中处于等待状态?

nos*_*nos 18

现在linux上的线程试图保持posix complient.只复制调用线程,而不是其他线程(请注意,例如在solaris上,你可以选择fork做什么,具体取决于你链接的库)

来自http://www.opengroup.org/onlinepubs/000095399/functions/fork.html:

应使用单个线程创建进程.如果多线程进程调用fork(),则新进程应包含调用线程的副本及其整个地址空间,可能包括互斥锁和其他资源的状态.因此,为了避免错误,子进程可能只执行异步信号安全操作,直到调用其中一个exec函数为止.可以通过pthread_atfork()函数建立fork处理程序,以便跨fork()调用维护应用程序不变量.


dlo*_*owe 0

线程不是使用 fork() 从 Linux 系统上的子进程继承的。深入的来源在这里: http: //linas.org/linux/threads-faq.html

  • 该常见问题解答已经过时了。用户可见的最大区别是,自内核 2.6 和 glibc 2.3 以来,LinuxThreads 已被 NPTL 淘汰,它解决了非 POSIX 类线程行为的所有突出问题。 (3认同)