假设在调用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
这个执行顺序是否得到保证?
答案 0 :(得分:3)
不,它不能保证。例如,如果第一个处理程序被调用并想要写入,那么如果第二个缓冲区尚不可读,该怎么办?写当然应该先写。但是,如果在第二个缓冲区准备好读取时写入是不可能的呢?当然,第二次读取应该在第一次写入之前发生。
答案 1 :(得分:1)
您可以使用strand
s
这里有一个很好的描述: Why do I need strand per connection when using boost::asio?
答案 2 :(得分:1)
您滥用boost::asio
界面。
单个套接字上可能没有多个挂起的读取操作。
来自boost::asio::async_read
docs:
此操作是根据对零的或多个调用实现的 stream的async_read_some函数,被称为组合 操作。程序必须确保流不执行任何其他操作 读取操作(例如async_read,流的async_read_some 函数,或执行读取的任何其他组合操作,直到 此操作完成。