Bueno, depende del contexto de la llamada, es decir, es que se ejecute desde dentro de la io_service o sin:
post
no va a llamar a la función directamente, nunca, pero posponer la llamada.
dispatch
lo llamarán rightaway si el despacho-persona que llama se llamó desde io_service sí, pero Cola de otra manera.
Por lo tanto, depende de la función a la que se llamó a llamar a la publicación/despacho, y si el manejador determinado se puede llamar de inmediato o no.
Lo que esto significa:
... es que dispatch
eventualmente podría llamar a su código de nuevo (por supuesto, esto depende de su aplicación y cómo se encadenan llamadas), pero en general usted debe asegurarse de que su la devolución de llamada es reingresante si usa dispatch
.
dispatch
es por lo tanto más rápido, ya que evita la cola de la llamada, si es posible. Viene con algunas advertencias, por lo que es posible que desee utilizar post
de vez en cuando, o siempre (si quiere ir a lo seguro y puede pagarlo).
actualización
incorporar algunos de respuesta borrado @gimpf 's, una versión impulso mayor tenía esta implementación de expedición (mis comentarios):
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
}
¿Qué quiere decir por ~ "** no va a llamar a la función directamente, nunca ** ¿Cómo será la función llamará a continuación –
@IgorGanapolsky:?. Por * * directamente me refiero como un descendiente de la'post() 'Call you make. En su lugar, se llamará indirectamente debido a que usted llama a poll() o un método de bucle superior similar que verifica si hay algún trabajo pendiente (llamadas a enviar, temporizadores que han expirado o nuevos datos en enchufes, etc.). – Macke