屈服于Boost.Asio Stackful Coroutine

Emi*_*ier 6 c++ boost coroutine boost-asio c++11

使用Boost.Asio堆栈协程时,如何"手动"生成以便另一个协程或异步操作有机会运行?例如,我需要在对从TCP套接字收到的命令发送响应之前执行长计算:

asio::spawn(strand_, [this, self](asio::yield_context yield)
{
    char data[256];
    while (socket_.is_open())
    {
        size_t n = socket_.async_read_some(boost::asio::buffer(data),
                                           yield);

        if (startsWith(data, "computePi"))
        {
            while (!computationFinished)
            {
                computeSomeMore();
                yield; // WHAT SHOULD THIS LINE BE?
            }

            storeResultIn(data);
            boost::asio::async_write(socket_, boost::asio::buffer(data, n),
                                     yield);
        }
    }
});
Run Code Online (Sandbox Code Playgroud)

Jam*_*ree 5

这比你想象的要简单:

iosvc.post(yield);
Run Code Online (Sandbox Code Playgroud)

会成功的。

iosvc借用@sehe的示例代码)


Emi*_*ier 0

从 Boost 1.80 开始,Jamboree 的答案不再有效。对我有用的是:

boost::asio::post(boost::asio::get_associated_executor(yield), yield);
Run Code Online (Sandbox Code Playgroud)