我正在使用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
方法协程函数内部执行。
您需要等待直到协程完成,才需要在run
上调用io_context
-前提是您没有使用此io
对象来启动其他一些异步任务(因此您应该创建专用的io_context
实例为您的协程)。
如果要处理多个协程,则必须在后台线程run
中调用。
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,但是它显示了如何加入协程)。