从实现中可以明显看出,在单线程模式下运行时,IO完成回调的调用顺序与实际IO操作的顺序相同,但我找不到文档的相应部分确认。它是否明确写在哪里?
答案 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时启动另一个操作。