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

问题描述:

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

所以说得更好,比方说我有方法A,A1和A2。方法A将开始执行,并在某些时候它会:下一个新的进程

  • 等待

    1. Run方法A1为A1下的另一个新工艺完成,并可能获得返回值
    2. Run方法A2
    3. 等待A2完成,并再次获得返回值
    4. 继续原来的程序下运行的代码

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

  • +1

    你可能想要[threads](http://en.cppreference.com/w/cpp/thread)。 – Andrew

    +0

    对于我所需要的,不幸的是不仅仅是多线程: - / –

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

    然后,您的子进程应该在exit完成之后,否则这些函数将返回子进程和父进程。

    这听起来像多线程可能是你最好的选择。这样你可以共享相同的内存空间,并且可以轻松获得返回值。看看使用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(...),它可以为函数生成线程。