首页 > 解决方案 > 从 C++ 程序运行两个系统命令并等待两者完成

问题描述

我正在编写一个 C++ 程序,在某些时候我需要使用动态定义的参数运行的另外两个程序的输出。目前我运行两个外部程序,如下例所示:

...
system("prog1 arg1".c_str());
system("prog2 arg2".c_str());

if(output1_exist() && output2_exist()){
  data1 = loadoutput1();
  data2 = loadoutput2();
  dosomething(data1, data2);
} else {
  cerr << "error" << endl;
  exit(1);
}
...

关键是两个外部程序都可以运行很长时间,所以我想同时运行它们并使用while循环和睡眠来等待两者完成:

...
system("prog1 arg1 &".c_str());
system("prog2 arg2 &".c_str());

while(true){
  if(output1_exist() && output2_exist()){
    break;
  } else {
    sleep(60);
  }
}

data1 = loadoutput1();
data2 = loadoutput2();

dosomething(data1, data2);
...

这种方法的问题在于,如果一个或两个外部程序由于某种原因失败,我将永远被锁定在 while 循环中。为了避免这个问题,我想使用两个线程,如下例所示:

...
void runextprog(string command){
  system(command.c_str())
}

...

vector < thread > threadVect;

threadVect.clear();
threadVect.emplace_back(runextprog, "prog1 arg1");
threadVect.emplace_back(runextprog, "prog2 arg2");

threadVect[0].join();
threadVect[1].join();

if(output1_exist() && output2_exist()){
  data1 = loadoutput1();
  data2 = loadoutput2();
  dosomething(data1, data2);
} else {
  cerr << "error" << endl;
  exit(1);
}
...

这应该可行,但对我来说似乎有点过分了。

那么,有人可以建议我以更优雅和简单的方式来做我正在寻找的事情吗?我正在开发一个多核 linux 工作站,我可能总是在类似的设置中运行我的程序,但是可以在 win/mac 机器上运行的便携式解决方案将不胜感激。谢谢你。

标签: c++multithreading

解决方案


推荐阅读