Увеличьте asio отправку io_service против почты - PullRequest
30 голосов
/ 24 февраля 2010

Может кто-нибудь сказать мне разницу между io_service dispatch и post ? Мне было не ясно, что больше подходит для моей проблемы.

Мне нужно вызвать обработчик внутри другого обработчика, и я не знаю, какой invoker использовать.

Ответы [ 2 ]

35 голосов
/ 24 февраля 2010

Ну, это зависит от контекста вызова, т.е. выполняется ли он из io_service или без него:

  • post никогда не вызовет функцию напрямую, но отложит вызов.
  • dispatch будет вызывать его прямо сейчас, если вызывающий диспетчер был вызван из самого io_service, но поставлен в очередь в противном случае.

Таким образом, это зависит от функции, вызывающей post / dispatch, и от того, может ли данный обработчик быть вызван сразу или нет.

Что это значит:

... заключается в том, что dispatch может в конечном итоге вызвать ваш код снова (естественно, это зависит от вашего приложения и того, как вы объединяете вызовы), но в целом вы должны убедиться, что ваш обратный вызов повторяется используйте dispatch.

dispatch, таким образом, быстрее, так как по возможности избегает очереди вызовов. Он поставляется с некоторыми оговорками, поэтому вам может потребоваться время от времени или * всегда использовать post (если вы хотите быть осторожным и можете себе это позволить).

Обновление

Чтобы включить некоторые из удаленного ответа @gimpf, более старая версия Boost имела такую ​​реализацию отправки (мои комментарии):

template <typename Handler>
void dispatch(Handler handler)
{
  if (call_stack<win_iocp_io_service>::contains(this)) // called from within io_service?
    boost_asio_handler_invoke_helpers::invoke(handler, &handler); // invoke rightaway
  else
    post(handler); // queue
}
10 голосов
/ 11 апреля 2012

см. Эту запись в блоге:
Размещать или отправлять? - Эта тема

Запустив приложение, мы увидим разницу между публикацией и диспетчеризация. Поскольку это может сделать это, dispatch () будет выполнять fB () непосредственно, так что мы увидим, что он работает в текущем потоке, и синхронно. С другой стороны, post () попросит io_service сделать задание, асинхронно в другом потоке, и оно сразу же возвращается контроль звонящему.

...