boost.asio是否对完成处理程序订购提供任何保证?我已经启动了一个async_read &单个async_write操作。我在内部使用epoll_reactor。如果套接字变成可同时可读的&,那么我的读(或写)操作以及因此完成处理程序将以特定的顺序执行总是boost.asio:async_read/async_write完成处理程序订购
目前,阅读epoll_reactor.ipp:perform_io,似乎是这种情况。但ASIO文件是否能保证?
boost.asio是否对完成处理程序订购提供任何保证?我已经启动了一个async_read &单个async_write操作。我在内部使用epoll_reactor。如果套接字变成可同时可读的&,那么我的读(或写)操作以及因此完成处理程序将以特定的顺序执行总是boost.asio:async_read/async_write完成处理程序订购
目前,阅读epoll_reactor.ipp:perform_io,似乎是这种情况。但ASIO文件是否能保证?
没有保证。另外,最好不要依赖任何这种“排序”的东西。这是竞争条件和其他错误的重要领域。
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)
,但为了在这些执行不明确。也就是说,你无法说明是否发生了一件事。因此没有订单保证。
它没有记录,所以我强烈建议不要依赖它。尽管如此,这应该不重要。到第一个处理程序事件发生时,第二个事件已经发布到io_service。没有什么可以阻止它被执行。 –
此外,如果您有多个线程通过io_service运行,则两个处理程序将同时执行。 –
我没有使用多个线程。无论如何感谢您的答案。我在文档之后 – zrb