2016-06-14 68 views
-1

boost.asio是否对完成处理程序订购提供任何保证?我已经启动了一个async_read &单个async_write操作。我在内部使用epoll_reactor。如果套接字变成可同时可读的&,那么我的读(或写)操作以及因此完成处理程序将以特定的顺序执行总是boost.asio:async_read/async_write完成处理程序订购

目前,阅读epoll_reactor.ipp:perform_io,似乎是这种情况。但ASIO文件是否能保证?

+1

它没有记录,所以我强烈建议不要依赖它。尽管如此,这应该不重要。到第一个处理程序事件发生时,第二个事件已经发布到io_service。没有什么可以阻止它被执行。 –

+0

此外,如果您有多个线程通过io_service运行,则两个处理程序将同时执行。 –

+0

我没有使用多个线程。无论如何感谢您的答案。我在文档之后 – zrb

回答

0

没有保证。另外,最好不要依赖任何这种“排序”的东西。这是竞争条件和其他错误的重要领域。

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),但为了在这些执行不明确。也就是说,你无法说明是否发生了一件事。因此没有订单保证。