boost::asio如何生成多个协同程序,然后加入它们

boost::asio how spawn multiple coroutine, and then join them?

本文关键字:然后 程序 asio 何生成 boost      更新时间:2023-10-16

我正在使用boost::asio,我的代码如下:

void my_coroutine(boost::asio::io_context& io, boost::asio::yield_context yield)
{
boost::asio::spawn(io, other_1_coroutine);
boost::asio::spawn(io, other_2_coroutine);
async_wait(other_1 and other_2);
continue_do_something();
}

我希望同时产生2个或更多的协同程序,然后异步等待它们。我尝试了协同程序TS,但g++还不支持。我怎样才能做到这一点?

当您调用spawn函数时,您将作为第一个参数传递执行上下文(作为io_context类的实例(。在这个对象内部,严格在io_context::run方法内部执行协程函数。

您所需要等待的就是在io_context上调用run,前提是您没有使用此io对象来启动其他一些异步任务(因此您应该为您的协同程序创建专用的io_context实例(。

如果你想处理多个协同程序,你必须调用后台线程runmetod。

boost::asio::spawn(io, other_1_coroutine);
boost::asio::spawn(io, other_2_coroutine);
// join section:
std::thread th( [&](){ io.run(); } );
io.run();
th.join();
continue_do_something();

在上面的代码中,我们创建了一个调用run的线程。因此,run的两个调用同时工作,并执行两个启动的协同程序。

Demo(它与代码不是1:1,但它展示了如何加入协同程序(。

相关文章: