多线程程序创建新进程时会发生什么?

时间:2016-02-10 00:02:43

标签: c multithreading process pthreads

我有点困惑我想详细了解,如果有多个线程的C程序创建新进程会发生什么。行为是否取决于创建新进程的线程或创建新进程的线程数?

1 个答案:

答案 0 :(得分:4)

使用pthreads,调用fork时,只有调用线程在新进程中分叉。

来自Linux man page

  

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

然而,Solaris上有一些版本的fork可以复制所有线程。

来自Solaris man page

  

对forkall()或forkallx()的调用在子进程中复制   所有的线程(见          父进程中的thr_create(3C)和pthread_create(3C))。对fork1()或forkx()的调用          仅复制子进程中的调用线程。

     

对fork()的调用与对fork1()的调用相同;只有电话   线程在子进程中被复制。这是POSIX指定的   fork()的行为。

     

在Solaris 10之前的Solaris发行版中,fork()的行为   取决于申请是否与该申请有关   POSIX线程库。与-lthread链接时(Solaris线程)   但是没有与-lpthread(POSIX Threads)链接,fork()是一样的   作为forkall()。与-lpthread链接时,是否也是   与-lthread链接,fork()与fork1()相同。