boost.asio: async_read/async_write completion handler ordering

↘锁芯ラ 提交于 2020-06-29 05:09:28

问题


Does boost.asio provide any guarantees on completion handler ordering? I have initiated a single async_read & a single async_write operation. I am using the epoll_reactor internally. If the socket becomes both readable & writable simultaneously, will my read (or write) operation and hence completion handler be executed in a particular order always

Currently, reading the epoll_reactor.ipp:perform_io, that seems to be the case. But does the ASIO documentation guarantee that?


回答1:


There is no guarantee. Also, its better to not to rely on any such "ordering" things. This is big field for race conditions and other bugs.




回答2:


Boost.Asio provides no guarantees as to the order in which completion handlers will be invoked.

The io_service currently makes no guarantees about the invocation order of handlers. Thus, the io_service is free to choose an arbitrary order, even if underlying reactor implementation was known to perform operations and post completion handlers in a known order. Currently, only a strand specifies guarantees to the order in which posted handlers execute, and it explicitly notes that the order of completion handlers is unspecified.

Order of handler invocation

Given:

  • a strand object s
  • an object a meeting completion handler requirements
  • an object b meeting completion handler requirements

...

Note that in the following case:

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

the completion of the first async operation will perform s.dispatch(a), and the second will perform s.dispatch(b), but the order in which those are performed is unspecified. That is, you cannot state whether one happens-before the other. Therefore [...] no ordering guarantee is made.



来源:https://stackoverflow.com/questions/37809895/boost-asio-async-read-async-write-completion-handler-ordering

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!