我的程序非常非常大。所以,我不能在这里列出。我的程序使用openMPI &mutiple_thread。
问题已解决。(使用vfork()而不是fork())但我不知道它为什么有效。有人能给我解释一下吗?
问题是由free()引起的。我的程序中有一些代码段。所有这些段都在由pthread_create创建的线程中。这些段的逻辑如下:
{
*p = malloc();
fun(p);
free(p);
}
所有错误都在free()中。它报告一个段故障错误。我把程序运行了一百多次。我发现总是有一个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 MPI使用pthread_atfork()
注册fork()
处理程序。在现代Linux系统上使用vfork()
时不会调用处理程序,因此父进程在分叉时不会采取任何操作。