1

我将编写一个程序,其中主线程创建新线程,然后新线程创建一个子进程。由于我很难跟踪新线程和分叉进程,我想从某人那里得到一个明智的答案。

我的问题是

  • 1.线程中创建的进程是否开始执行代码pthread_create
  • 2.如果不是1,如果线程中发生fork调用,fork进程从哪里开始?

    感谢您阅读我的问题。

  • 4

    1 回答 1

    0

    其中一些有点依赖于操作系统,因为不同的系统具有不同的 POSIX 线程实现,这可能会暴露内部结构。

    POSIX 提供pthread_atfork了一种有点生硬的工具来处理一些问题,但在我看来它仍然很混乱。

    如果您的系统使用“用户空间线程”和“内核线程”之间的一对一映射,使用cloneorrfork来实现线程之间正确的用户空间数据共享,那么fork只会复制调用它的(单个)线程。但是,如果您的系统具有多对多样式映射(因此一个用户进程正在处理多个线程,至少在它们进入阻塞系统调用之前),fork则可能在内部复制多个线程。POSIX 说它应该看起来只复制了一个线程,所以这不应该是可见的,但我不确定所有系统如何实现这一点。

    在http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them有一些一般性建议(显然,以 Linux 为中心,但仍然有用)。

    您是否有某些特殊原因想要fork在线程内但不是exec?一般来说,如果你只想并行运行更多代码,你只需分离另一个线程(即,一旦你选择运行任何线程,你就在线程中做所有事情,除非你必须forkfor exec; 如果exec失败,只是_exit)。

    于 2013-05-27T17:56:23.023 回答