我的程序很大。因此,我无法在这里列出。我的程序使用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()时,根本没有问题。但我不知道它为什么起作用。
那么,有谁能解释它为什么起作用?
您可能会发现有关派生子进程的Open MPI FAQ主题非常有用。也fork()
可以在此处找到有关为什么使用InfiniBand危险的解释。
vfork(2)
区别fork(2)
在于它专门设计为尽可能轻巧,并且仅用于与紧随其后的对象execve(2)
(或C库中的任何包装器)或_exit(2)
调用一起使用。这样做的原因是vfork(2)
创建了一个子进程,该进程与父进程共享所有内存,而不是将其写复制时映射到该进程,即新的子进程更像一个线程,而不是一个成熟的进程。由于子进程也使用原始线程的堆栈,因此父进程将被阻塞,直到子进程执行另一个可执行文件或退出该进程为止。
Open MPIfork()
使用来注册处理程序pthread_atfork()
。vfork()
在现代Linux系统上使用时,不会调用处理程序,因此父进程在派生时不会采取任何操作。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句