零栈的协程
coroutine类提供了零栈协程的支持。零栈协程允许程序像使用同步逻辑那样实现异步逻辑,尽可能地减少消耗,就像下面的例子:
struct session : 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()(asio::error_code ec = asio::error_code(), std::size_t n = 0)
{
if(!ec) reenter (this)
{
for(;;)
{
yield socket_->async_read_some(asio::buffer(*buffer_), *this);
yield aiso::async_write(*socket_, asio::buffer(*buffer_, n), *this);
}
}
}
};
coroutine协程是由伪装的关键字 reenter, yield 和 fork来组成的。他们是预处理宏,内部是用switch语法实现的,coroutine章节有专门的详细实现方式。
参见
coroutine, HTTP Server 4 example, Stackful Coroutines.