零栈的协程

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.

results matching ""

    No results matching ""