io_service::run()处理async_*函数的顺序

io_service::run() processing order of async_* functions

本文关键字:函数 async 顺序 service run io 处理      更新时间:2023-10-16

假设在调用io_service::run()时,计划了多个async_read操作(它们之间可能还有其他操作)。当在ReadHandler函数中调度异步操作(如async_write)时会发生什么?

void handler(const boost::system::error_code& error, std::size_t bytes) {
    async_write(sock, boost::asio::buffer(wbuf), whandler);
}

也就是说,什么时候会调用async_write?我预计执行顺序是:

1) async_read //1
2) async_write
3) async_read //2
4) async_write

这个执行顺序有保证吗?

不,不能保证。例如,如果第一个处理程序被调用并想要写入,那么如果第二个缓冲区还不能读取呢?当然,写作应该放在第一位。但是,如果在第二个缓冲区准备好读取时无法进行写入,该怎么办?当然,第二次读取应该发生在第一次写入之前。

您滥用了boost::asio接口。

一个套接字上可能没有多个挂起的读取操作。

引用boost::asio::async_read文档:

此操作是根据对stream的async_read_some函数,并且被称为composed活动程序必须确保流不执行其他操作读取操作(如async_read、流的async_read_some函数或执行读取的任何其他组合操作),直到此操作完成。

您可以使用strand的强制执行顺序

  • http://www.boost.org/doc/libs/1_56_0/doc/html/boost_asio/reference/io_service__strand.html

这里有一个很好的描述:为什么在使用boost::asio时,我需要每个连接一条