从 1.54.0 版本开始,Boost.Asio 开始支持协程。异步编程是复杂的,协程可以让我们以同步的方式编写出异步的代码,在提高代码可读性的同时又不会丢失性能。
在 Boost.Asio 要怎样才能使用协程呢?可以使用boost::asio::spawn()
开启一个协程:
1 | boost::asio::spawn(strand, echo); |
spawn()
的第一个参数可以是io_service
,也可以是strand
(如果需要在多线程中保证同步,可以使用strand
)。
协程可以提供代码可读性,例如,如果没有使用协程,那么我们需要编写很多回调函数:
1 | void handleRead(boost::system::error_code ec, std::size_t bytes_transferred) |
使用协程之后,就不需要回调函数了:
1 | try { |
上面的代码,如果出现错误就会抛出异常。当然我们也可以使用错误码替代异常:
1 | boost::system::error_code ec; |
下面是通过协程实现的EchoServer
:
1 | class TCPConnection : public std::enable_shared_from_this<TCPConnection> |