我将编写一个程序,其中主线程创建新线程,然后新线程创建一个子进程。由于我很难跟踪新线程和分叉进程,我想从某人那里得到一个明智的答案。
我的问题是
pthread_create
?感谢您阅读我的问题。
其中一些有点依赖于操作系统,因为不同的系统具有不同的 POSIX 线程实现,这可能会暴露内部结构。
POSIX 提供pthread_atfork
了一种有点生硬的工具来处理一些问题,但在我看来它仍然很混乱。
如果您的系统使用“用户空间线程”和“内核线程”之间的一对一映射,使用clone
orrfork
来实现线程之间正确的用户空间数据共享,那么fork
只会复制调用它的(单个)线程。但是,如果您的系统具有多对多样式映射(因此一个用户进程正在处理多个线程,至少在它们进入阻塞系统调用之前),fork
则可能在内部复制多个线程。POSIX 说它应该看起来只复制了一个线程,所以这不应该是可见的,但我不确定所有系统如何实现这一点。
在http://www.linuxprogrammingblog.com/threads-and-fork-think-twice-before-using-them有一些一般性建议(显然,以 Linux 为中心,但仍然有用)。
您是否有某些特殊原因想要fork
在线程内但不是exec
?一般来说,如果你只想并行运行更多代码,你只需分离另一个线程(即,一旦你选择运行任何线程,你就在线程中做所有事情,除非你必须fork
for exec
; 如果exec
失败,只是_exit
)。