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

时间:2014-09-08 12:53:09

标签: c++ boost boost-asio

假设在调用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

这个执行顺序是否得到保证?

3 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

答案 2 :(得分:1)

您滥用boost::asio界面。

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

来自boost::asio::async_read docs:

的引用
  

此操作是根据对零的或多个调用实现的   stream的async_read_some函数,被称为组合   操作。程序必须确保流不执行任何其他操作   读取操作(例如async_read,流的async_read_some   函数,或执行读取的任何其他组合操作,直到   此操作完成。