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

问题描述 投票:0回答:1

我正在使用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 ++还不支持。我怎样才能做到这一点?

c++ join yield coroutine asio
1个回答
0
投票

当您调用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,但是它显示了如何加入协程)。

© www.soinside.com 2019 - 2024. All rights reserved.