boost.asio是否在完成处理程序排序时提供任何保证?我发起了一个async_read&单个async_write操作。我在内部使用epoll_reactor。如果插座变得既可读又可读同时可写,我的读取(或写入)操作以及因此完成处理程序将按特定顺序执行
目前,阅读epoll_reactor.ipp:perform_io,似乎就是这种情况。但ASIO文档是否保证了这一点?
答案 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)
,但未指定执行这些操作的顺序。也就是说,你无法说明一个是否发生在另一个之前。因此,没有订购保证。