我的节目非常大。所以,我不能在这里列出它。我的程序使用openMPI& mutiple_thread。
问题已经解决了。 (使用vfork()而不是fork())但我不知道它为什么会起作用。那么,有人能给我解释一下吗?
问题是由free()引起的。 我的程序中有一些代码段。所有这些段都在由pthread_create创建的线程中。这些细分的逻辑如下:
{
*p = malloc();
fun(p);
free(p);
}
所有错误都是免费的()。它报告段错误。我运行程序超过100次。我发现在每次损坏之前总会有一个fork()被释放。
fork segment的逻辑就像(在线程中):
{
MPI_program_code...
if(!fork())
{
execv(exe_file,arg);
}
MPI_program_code...
}
(注意,在exe_file中没有使用MPI_function。)
当我使用vfork()而不是fork()时,根本没有问题。但我不知道它为什么会起作用。
那么,有人可以解释它为什么会起作用吗?
答案 0 :(得分:2)
您可能会发现forking child processes上的Open MPI FAQ主题非常有用。此外,还可以找到有关使用fork()
与InfiniBand一起使用的原因的解释here。
vfork(2)
与fork(2)
的不同之处在于它专门设计为尽可能轻量级,并且只能与紧跟一起使用{{1} (或其来自C库的任何包装)或execve(2)
调用。原因是_exit(2)
创建了一个子进程,它与父进程共享所有内存,而不是映射了copy-copy,即新子进程更像是一个线程而不是一个完整的进程。由于孩子也使用原始线程的堆栈,因此父项被阻止,直到孩子执行了另一个可执行文件或退出。
使用vfork(2)
打开MPI注册fork()
处理程序。在现代Linux系统上使用pthread_atfork()
时不会调用处理程序,因此父进程在分叉时不会执行任何操作。