在新进程中运行方法并等待它们完成
问题描述:
我需要我的应用程序能够在新进程下运行某些方法,并且理想情况下能够从这些方法获取返回值,但是我还没有找到我可以做到这一点(我的C++知识是非常基本的)。在新进程中运行方法并等待它们完成
所以说得更好,比方说我有方法A,A1和A2。方法A将开始执行,并在某些时候它会:下一个新的进程
- Run方法A1为A1下的另一个新工艺完成,并可能获得返回值
- Run方法A2
- 等待A2完成,并再次获得返回值
- 继续原来的程序下运行的代码
我发现我可以使用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做同样的事情。
答
这听起来像多线程可能是你最好的选择。这样你可以共享相同的内存空间,并且可以轻松获得返回值。看看使用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(...),它可以为函数生成线程。
你可能想要[threads](http://en.cppreference.com/w/cpp/thread)。 – Andrew
对于我所需要的,不幸的是不仅仅是多线程: - / –