0

我有一个程序在整个程序的各个检查点之间同时顺序和并行执行相同的代码。为此,初始程序派生出一个顺序运行的子进程,而父进程并行运行。无论哪个进程首先到达下一个检查点,然后终止另一个进程,并重复此过程直到执行结束,从而尽可能快地执行(忽略分叉和复制开销)。

我已经实现了这一点,当只有顺序执行最快或只有并行执行最快时一切正常,但是当前几个部分并行执行最快,然后接下来的几个部分按顺序执行最快时,程序会在两个进程都处于休眠状态时停止。我看不出是什么原因造成的。我是否达到了对分叉进程施加的一些限制?杀死父进程是否会影响分叉子进程的执行,反之亦然?

下面的代码给出了我的函数checkPoint(),该函数在每个检查点执行,一些自定义代码处理最后一部分的末尾。并行代码是使用 OpenMP 实现的,顺序代码永远不会遇到 OpenMP pragma 语句。

pid_t parent = 0;
pid_t child = 0;

void checkPoint() {

    if (parent == 0) {

        // First Time
        parent = getpid();

    } else if (child == 0) {

        // Child Process
        kill(parent, SIGKILL);
        parent = getpid();

    } else {

        // Parent Process
        kill(child, SIGKILL);

    }

    child = fork();

}

谢谢,

4

1 回答 1

0

事实证明,这是使用 gcc、OpenMP 和 forks 时出现的错误。

取自http://bisqwit.iki.fi/story/howto/openmp/#OpenmpAndFork

如果您的程序打算使用 daemonize() 或其他类似方式成为后台进程,则不得在 fork 之前使用 OpenMP 功能。使用 OpenMP 功能后,仅当子进程不使用 OpenMP 功能或作为全新进程(例如在 exec() 之后)使用时才允许分叉。

于 2013-03-02T21:38:00.483 回答