我需要我的应用程序能够在新进程下运行某些方法,理想情况下能够从这些方法中获取返回值但是我还没有找到如何做到这一点(我的C ++知识非常基本)
所以为了更好地解释,让我们说我有方法A,A1和A2。方法A将开始执行,并且在某些时候它将:
我发现我可以使用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做同样的事情。
答案 0 :(得分:3)
答案 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(...),它可以为函数生成线程。