Класс<coroutine
>обеспечивает поддержку стековых корутин. Корутины без стека позволяют программам реализовывать асинхронную логику синхронно, с минимальными накладными расходами, как показано в следующем примере:
struct session : boost::asio::coroutine
{
boost::shared_ptr<tcp::socket> socket_;
boost::shared_ptr<std::vector<char> > buffer_;
session(boost::shared_ptr<tcp::socket> socket)
: socket_(socket),
buffer_(new std::vector<char>(1024))
{
}
void operator()(boost::system::error_code ec = boost::system::error_code(), std::size_t n = 0)
{
if (!ec) reenter (this)
{
for (;;)
{
yield socket_->async_read_some(boost::asio::buffer(*buffer_), *this);
yield boost::asio::async_write(*socket_, boost::asio::buffer(*buffer_, n), *this);
}
}
}
};
Класс<coroutine
>используется в сочетании с псевдоключевыми словами<reenter
>,<yield
>и<fork
>. Они являются препроцессорными макросами и реализуются в виде<switch
>заявления с использованием метода, аналогичного устройству Даффа. В документации класса<coroutine
>приводится полное описание этих псевдоключевых слов.
coroutine,HTTP Server 4 example,Stackful Coroutines.