【问题标题】:What happens when multi thread program creates new processes?当多线程程序创建新进程时会发生什么?
【发布时间】:2016-05-20 04:15:15
【问题描述】:

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

【问题讨论】:

  • 发生了很多事情。我们无法真正从零开始向您解释一切。因此,您的问题需要比询问“发生了什么”更具体一些。但是对于初学者,您可能需要阅读fork man page,然后是pthread_atfork man page。后者的“基本原理”部分可能会对您有所帮助。如果不是,请澄清您的问题。
  • 更具体的问题:如果具有多个线程的 C 程序创建新进程会发生什么情况。忽略第二部分。
  • 这并不是更具体。您仍然在问一个非常广泛的“发生了什么”。发生的事情(在 Linux 上)是每次创建都会产生一个新进程,该进程具有一个线程,并且地址空间内容从父进程复制。但是上面的手册页中描述了许多细节和微妙之处。如果有什么具体的你不明白,那就问吧。否则问“发生了什么”有点宽泛。

标签: c multithreading process pthreads


【解决方案1】:

使用 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 线程)链接,fork() 是相同的 作为 forkall()。与 -lpthread 链接时,是否也 与 -lthread 链接,fork() 与 fork1() 相同。

【讨论】:

  • @ConorWhyman fork and relatives 是创建新进程的几种方法之一。其他进程启动方法的行为与fork() 不同。此外,本机不支持fork() 的操作系统将具有非常不同的启动过程行为。
猜你喜欢
  • 2020-08-31
  • 1970-01-01
  • 2017-02-14
  • 2019-02-11
  • 1970-01-01
  • 2014-06-15
  • 2013-06-09
  • 2012-08-06
  • 2015-05-26
相关资源
最近更新 更多