Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/133.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost创建要异步运行的多个子进程_C++_Asynchronous_Boost_Boost Process - Fatal编程技术网

C++ 使用boost创建要异步运行的多个子进程

C++ 使用boost创建要异步运行的多个子进程,c++,asynchronous,boost,boost-process,C++,Asynchronous,Boost,Boost Process,如何生成应异步运行的多个子进程?我是否使用子进程的向量?恐怕下面的代码无法完成我想要完成的任务。对于将参数传递给子进程的其他不同方式的任何建议也是欢迎的 #include <iostream> #include <string> #include <sstream> #include "boost/process.hpp" int main() { namespace bp = boost::process; std::

如何生成应异步运行的多个子进程?我是否使用子进程的向量?恐怕下面的代码无法完成我想要完成的任务。对于将参数传递给子进程的其他不同方式的任何建议也是欢迎的

#include <iostream>
#include <string>
#include <sstream>
#include "boost/process.hpp"

int main()
{
    namespace bp = boost::process;

    std::string child_process_name = "child_process";

    std::cout << "main_process: before spawning" << std::endl;

    int num_processes = 5;
    for (int i = 0; i < num_processes; ++i)
    {
        std::cout << "main_process: spawning child " << i << std::endl;
        std::stringstream ss;
        ss << i;
        std::string is;
        ss >> is;
        bp::child c(child_process_name, std::vector<std::string> {is});
        c.join();
    }

    std::cout << "main_process: waiting for children" << std::endl;

    std::cout << "main_process: finished" << std::endl;

    return 0;
}

将每个进程(即bp::child)添加到向量中如何。然后在一个单独的循环中迭代向量,调用join。不要在已有的循环中调用join,否则事情只会按顺序运行。

将每个进程(即bp::child)添加到向量中如何。然后在一个单独的循环中迭代向量,调用join。不要在循环中调用join,否则事情将按顺序运行。

在启动下一个进程之前,您正在等待每个进程。相反,您应该生成它们,然后在循环之外等待它们。以下是编辑后的代码:

#include <iostream>
#include <string>
#include <sstream>
#include "boost/process.hpp"

int main()
{
    namespace bp = boost::process;

    std::string child_process_name = "child_process";

    std::cout << "main_process: before spawning" << std::endl;

    constexpr int num_processes = 5;
    std::vector<bp::child> childs;
    childs.reserve(num_processes);

    for (int i = 0; i < num_processes; ++i)
    {
        std::cout << "main_process: spawning child " << i << std::endl;
        std::stringstream ss;
        ss << i;
        std::string is;
        ss >> is;
        childs.emplace_back(bp::child(child_process_name, std::vector<std::string> {is}));
    }

    std::cout << "main_process: waiting for children" << std::endl;
    
    for (auto& ch : childs)
        ch.join();
    
    std::cout << "main_process: finished" << std::endl;

    return 0;
} 

您正在等待每个进程,然后再开始下一个进程。相反,您应该生成它们,然后在循环之外等待它们。以下是编辑后的代码:

#include <iostream>
#include <string>
#include <sstream>
#include "boost/process.hpp"

int main()
{
    namespace bp = boost::process;

    std::string child_process_name = "child_process";

    std::cout << "main_process: before spawning" << std::endl;

    constexpr int num_processes = 5;
    std::vector<bp::child> childs;
    childs.reserve(num_processes);

    for (int i = 0; i < num_processes; ++i)
    {
        std::cout << "main_process: spawning child " << i << std::endl;
        std::stringstream ss;
        ss << i;
        std::string is;
        ss >> is;
        childs.emplace_back(bp::child(child_process_name, std::vector<std::string> {is}));
    }

    std::cout << "main_process: waiting for children" << std::endl;
    
    for (auto& ch : childs)
        ch.join();
    
    std::cout << "main_process: finished" << std::endl;

    return 0;
} 

谢谢我创建的向量是std::vector childrennum_进程;然后将其元素赋值为childs[i]=bp::childchild_进程_名称,std::vector{is};,那是错的,谢谢!我创建的向量是std::vector childrennum_进程;然后将其元素赋值为childs[i]=bp::childchild_进程_名称,std::vector{is};,我试过了,但我做错了什么。请看我对@dev65答案的评论。我试过了,但我做错了什么。请看我对@dev65答案的评论。我认为这一条可能会有所帮助。我认为这一条可能会有所帮助