【问题标题】:Run methods in new process and wait for them to finish在新进程中运行方法并等待它们完成
【发布时间】:2016-04-21 12:42:02
【问题描述】:

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

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

  1. 在新进程下运行方法 A1
  2. 等待 A1 完成并可能得到返回值
  3. 在另一个新进程下运行方法 A2
  4. 等待A2完成,再次获取返回值
  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 上执行相同操作。

【问题讨论】:

  • 你可能想要threads
  • 对于我需要的东西,不幸的是它必须是一个单独的进程,而不仅仅是多线程:-/

标签: c++ linux process createprocess


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    在我看来,多线程可能是您的最佳选择。这样你就可以共享相同的内存空间,并且可以很容易地获得返回值。研究使用 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(...) ,它可以为函数生成线程。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-08-21
      • 1970-01-01
      • 1970-01-01
      • 2012-03-04
      • 1970-01-01
      • 2019-03-24
      • 1970-01-01
      • 2019-10-20
      相关资源
      最近更新 更多