MPI多线程中的vfork VS fork

用户3392320

我的程序很大。因此,我无法在这里列出。我的程序使用openMPI和mutiple_thread。

问题已解决。(使用vfork()而不是fork())但是我不知道它为什么起作用。那么,有人可以给我一个解释吗?

该问题是由free()引起的。我的程序中有一些代码段。所有这些段都在由pthread_create创建的线程中。这些段的逻辑如下:

{
    *p = malloc();
    fun(p);
    free(p);
}

所有错误都在free()上。报告段故障错误。我运行该程序超过100次。我发现在每次损坏之前总是有一个fork()被调用。

fork段的逻辑类似于(在线程中):

{
    MPI_program_code...
    if(!fork())
    {
        execv(exe_file,arg);
    }
    MPI_program_code...
}

(请注意,在exe_file中未使用MPI_function。)

当我使用vfork()而不是fork()时,根本没有问题。但我不知道它为什么起作用。

那么,有谁能解释它为什么起作用?

赫里斯特(Hristo)离开

您可能会发现有关派生子进程的Open MPI FAQ主题非常有用。fork()可以在此处找到有关为什么使用InfiniBand危险的解释

vfork(2)区别fork(2)在于它专门设计为尽可能轻巧,并且仅用于与紧随其后的对象execve(2)(或C库中的任何包装器)或_exit(2)调用一起使用。这样做的原因是vfork(2)创建了一个子进程,该进程与父进程共享所有内存,而不是将其写复制时映射到该进程,即新的子进程更像一个线程,而不是一个成熟的进程。由于子进程也使用原始线程的堆栈,因此父进程将被阻塞,直到子进程执行另一个可执行文件或退出该进程为止。

Open MPIfork()使用来注册处理程序pthread_atfork()vfork()在现代Linux系统上使用时,不会调用处理程序,因此父进程在派生时不会采取任何操作。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章