boost.asio:async_read / async_write完成处理程序排序

时间:2016-06-14 10:50:19

标签: c++ boost-asio

boost.asio是否在完成处理程序排序时提供任何保证?我发起了一个async_read&单个async_write操作。我在内部使用epoll_reactor。如果插座变得既可读又可读同时可写,我的读取(或写入)操作以及因此完成处理程序将按特定顺序执行

目前,阅读epoll_reactor.ipp:perform_io,似乎就是这种情况。但ASIO文档是否保证了这一点?

2 个答案:

答案 0 :(得分:0)

无法保证。此外,最好不要依赖任何这样的“订购”事物。这是竞争条件和其他错误的重要领域。

答案 1 :(得分:0)

Boost.Asio不保证调用完成处理程序的顺序。

io_service目前不保证处理程序的调用顺序。因此,即使已知基础反应器实现以已知顺序执行操作和完成后处理程序,io_service也可以自由选择任意顺序。目前,只有strand指定对已发布处理程序执行的顺序的保证,并且它明确指出未完成处理完成处理程序的顺序。

  

处理程序调用顺序

     

假设:

     
      
  • 一个子对象s
  •   
  • 对象a符合完成处理程序要求
  •   
  • 对象b符合完成处理程序要求
  •   
     

...

     

请注意,在以下情况中:

async_op_1(..., s.wrap(a));
async_op_2(..., s.wrap(b));
     

第一个异步操作的完成将执行s.dispatch(a),第二个将执行s.dispatch(b),但未指定执行这些操作的顺序。也就是说,你无法说明一个是否发生在另一个之前。因此,没有订购保证。