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

时间:2016-04-21 12:42:02

标签: c++ linux process createprocess

我需要我的应用程序能够在新进程下运行某些方法,理想情况下能够从这些方法中获取返回值但是我还没有找到如何做到这一点(我的C ++知识非常基本)

所以为了更好地解释,让我们说我有方法A,A1和A2。方法A将开始执行,并且在某些时候它将:

  1. 在新流程下运行方法A1
  2. 等待A1完成并可能获得返回值
  3. 在另一个新流程下运行方法A2
  4. 等待A2完成并再次获得返回值
  5. 继续在原始流程
  6. 下运行代码

    我发现我可以使用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做同样的事情。

2 个答案:

答案 0 :(得分:3)

首先,您的父进程应该wait以便子进程退出。

然后你的子进程一旦完成就应该exit,否则这些函数将在子进程和父进程上都返回。

答案 1 :(得分:0)

听起来像多线程可能是您的最佳选择。这样,您可以共享相同的内存空间,并且可以轻松获取返回值。考虑使用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;
    }

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