ASIO IO完成回调顺序与实际IO操作的顺序

时间:2016-06-14 15:18:20

标签: c++ boost-asio

从实现中可以明显看出,在单线程模式下运行时,IO完成回调的调用顺序与实际IO操作的顺序相同,但我找不到文档的相应部分确认。它是否明确写在哪里?

1 个答案:

答案 0 :(得分:3)

io-object类上所有async_xxx方法的文档都有这样的段落:

  

无论异步操作是否立即完成,都不会从此函数中调用处理程序。调用处理程序的调用将以方式执行,相当于使用 boost::asio::io_service::post()

查看boost::asio::io_service::post() ...

的文档
  

此函数用于要求io_service执行给定的处理程序,但不允许io_service从此函数内部调用处理程序。

     

io_service保证只在当前调用run()run_one()poll()poll_one()成员函数的线程中调用处理程序。< / p>

这就是您保证的全部范围。

如果你的代码依赖于异步事件的时间顺序,那么它就不是异步代码。

即使run_one()的文档也不保证将发送哪个处理程序:

  

run_one()函数阻塞,直到调度了一个处理程序,或者直到io_service停止为止。

如果您必须对单个异步操作(例如读取)进行排序,那么您必须:

  • 从第一个处理程序或

  • 启动第二个操作
  • 在操作处理程序未完成时保持标记设置,并且仅在标志为false时启动另一个操作。