...one of the most highly
regarded and expertly designed C++ library projects in the
world.
— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards
The coroutine
class provides support for stackless coroutines. Stackless coroutines enable
programs to implement asynchronous logic in a synchronous manner, with
minimal overhead, as shown in the following example:
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); } } } };
The coroutine
class is
used in conjunction with the pseudo-keywords reenter
,
yield
and fork
. These are preprocessor macros,
and are implemented in terms of a switch
statement using a technique similar to Duff's Device. The coroutine
class's documentation
provides a complete description of these pseudo-keywords.