运行 个新进程中的方法并等待它们完成
Run methods in new process and wait for them to finish
我需要我的应用程序能够 运行 新流程下的一些方法,理想情况下能够从这些方法中获得 return 值,但是我还没有找到我可以这样做(我的 C++ 知识非常基础)。
为了更好地解释,假设我有方法 A、A1 和 A2。方法 A 将开始执行,并且在某个时候它将:
- 运行新流程下的方法A1
- 等待 A1 完成并可能获得 return 值
- 运行另一个新进程下的方法A2
- 等待A2完成,再次获取return值
- 继续运行原流程下的代码
我发现我可以在子进程中使用 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 执行相同的操作。
首先你的父进程应该wait
让子进程退出。
然后你的子进程应该 exit
一旦它们完成,否则函数将 return 在子进程和父进程上。
在我看来,多线程可能是您的最佳选择。这样你共享相同的内存 space 并且可以轻松获得 return 值。考虑使用 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;
}
我在浏览器中修改了代码,因此我不能保证它可以编译,但这是您可以并行启动函数并获得 return 值的方法。我不认为分叉是最好的方法,因为你需要某种进程间通信来取回数据。此外,OpenMP 可能效率更高。您还可以考虑使用 PThreads,我认为 OpenMP 在支持上使用它,但它更复杂。此外,如果您使用的是 C++11,请考虑使用 std::async(...),它可以为函数生成线程。
我需要我的应用程序能够 运行 新流程下的一些方法,理想情况下能够从这些方法中获得 return 值,但是我还没有找到我可以这样做(我的 C++ 知识非常基础)。
为了更好地解释,假设我有方法 A、A1 和 A2。方法 A 将开始执行,并且在某个时候它将:
- 运行新流程下的方法A1
- 等待 A1 完成并可能获得 return 值
- 运行另一个新进程下的方法A2
- 等待A2完成,再次获取return值
- 继续运行原流程下的代码
我发现我可以在子进程中使用 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 执行相同的操作。
首先你的父进程应该wait
让子进程退出。
然后你的子进程应该 exit
一旦它们完成,否则函数将 return 在子进程和父进程上。
在我看来,多线程可能是您的最佳选择。这样你共享相同的内存 space 并且可以轻松获得 return 值。考虑使用 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;
}
我在浏览器中修改了代码,因此我不能保证它可以编译,但这是您可以并行启动函数并获得 return 值的方法。我不认为分叉是最好的方法,因为你需要某种进程间通信来取回数据。此外,OpenMP 可能效率更高。您还可以考虑使用 PThreads,我认为 OpenMP 在支持上使用它,但它更复杂。此外,如果您使用的是 C++11,请考虑使用 std::async(...),它可以为函数生成线程。