从 1.54.0 版本开始,Boost.Asio 开始支持协程。异步编程是复杂的,协程可以让我们以同步的方式编写出异步的代码,在提高代码可读性的同时又不会丢失性能。
  在 Boost.Asio 要怎样才能使用协程呢?可以使用boost::asio::spawn()开启一个协程:
  spawn()的第一个参数可以是io_service,也可以是strand(如果需要在多线程中保证同步,就需要使用strand,具体可以参见 [浅谈 Boost.Asio 的多线程模型])
  协程可以提供代码可读性,例如,如果没有使用协程,那么我们需要编写很多回调函数:
  使用协程之后,就不需要回调函数了:
  上面的代码,如果出现错误就会抛出异常。当然我们也可以使用错误码替代异常: