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

ASIO IO completion callbacks order vs the order of actual IO operations

本文关键字:IO 操作 顺序 回调 ASIO      更新时间:2023-10-16

从实现中可以明显看出,IO完成回调在单个线程模式下运行时以与实际的IO操作相同的顺序调用,但是我找不到文档的各个部分确认这一点。它在任何地方都明确书写吗?

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()成员功能的线程中调用处理程序。

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

如果您的代码依赖于异步事件的时间顺序,则它不是异步代码。

即使是run_one()的文档也无法保证处理程序将派遣:

run_one()功能块,直到派遣一个处理程序,或直到停止io_service为止。

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

  • 从第一个处理程序或

    启动第二个操作
  • 在操作的处理程序出色时保留标志集,并且仅在标志为false时启动另一个操作。