运行 个新进程中的方法并等待它们完成

Run methods in new process and wait for them to finish

我需要我的应用程序能够 运行 新流程下的一些方法,理想情况下能够从这些方法中获得 return 值,但是我还没有找到我可以这样做(我的 C++ 知识非常基础)。

为了更好地解释,假设我有方法 A、A1 和 A2。方法 A 将开始执行,并且在某个时候它将:

  1. 运行新流程下的方法A1
  2. 等待 A1 完成并可能获得 return 值
  3. 运行另一个新进程下的方法A2
  4. 等待A2完成,再次获取return值
  5. 继续运行原流程下的代码

我发现我可以在子进程中使用 fork() 到 运行 代码,但这不符合我的需要,因为它似乎正在创建父进程的副本而不仅仅是 运行宁我只在新进程中想要的特定代码。这是我尝试过的摘录,我不确定是否可以修改它来做我想做的事情,或者我是否应该完全使用其他东西:

int main(){
    std::cout << "START" << std::endl;

    test1();
    test2();

    std::cout << "FINISH" << std::endl;
    return 0;
}

void test1(){
        pid_t pid = fork();

        if (pid == 0){
            int i = 0;
            for (; i < 5; ++i) {
                std::cout << "Test 1 " << std::endl;
            }
        }
    }

void test2(){
        pid_t pid = fork();

        if (pid == 0){
            int i = 0;
            for (; i < 5; ++i) {
                std::cout << "Test 2 " << std::endl;
            }
        }
    }

然而,这导致 test2() 被执行两次,并且 FINISH 被打印 4 次,因为父进程被复制到子进程。

我目前正在 Linux 上执行此操作,尽管我最终需要为 Windows 执行相同的操作。

首先你的父进程应该wait让子进程退出。

然后你的子进程应该 exit 一旦它们完成,否则函数将 return 在子进程和父进程上。

在我看来,多线程可能是您的最佳选择。这样你共享相同的内存 space 并且可以轻松获得 return 值。考虑使用 OpenMP。我认为这是迄今为止最简单的多线程方法。您可以在并行块中为每个函数启动任务。

int main(){
    std::cout << "START" << std::endl;
    int ret1, ret2;
    #pragma omp parallel
    {
        #pragma omp task
        ret1 = test1();

        #pragma omp task
        ret2 = test2();
    } //blocks at end of parallel block to wait for tasks to finish

    std::cout << "FINISH" << std::endl;
    return 0;
}

int test1(){
            int i = 0;
            for (; i < 5; ++i) {
                std::cout << "Test 1 " << std::endl;
        }
      return 0;
    }

int test2(){
            int i = 0;
            for (; i < 5; ++i) {
                std::cout << "Test 2 " << std::endl;
            }
        return 0;
    }

我在浏览器中修改了代码,因此我不能保证它可以编译,但这是您可以并行启动函数并获得 return 值的方法。我不认为分叉是最好的方法,因为你需要某种进程间通信来取回数据。此外,OpenMP 可能效率更高。您还可以考虑使用 PThreads,我认为 OpenMP 在支持上使用它,但它更复杂。此外,如果您使用的是 C++11,请考虑使用 std::async(...),它可以为函数生成线程。