2010-02-24 10 views

Respuesta

29

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 
} 
+0

¿Qué quiere decir por ~ "** no va a llamar a la función directamente, nunca ** ¿Cómo será la función llamará a continuación –

+1

@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

9

ver esta entrada de blog:
To post or to dispatch? - This Thread

Al ejecutar la aplicación, veremos la diferencia entre la publicación y despachando. Como podría hacerlo, dispatch() ejecutaría fB() directamente, por lo que veremos que se ejecuta en el hilo actual y de forma síncrona. Por otro lado, post() solicitaría a io_service que realice el trabajo , de forma asíncrona en otro hilo, e inmediatamente devuelve el control a la persona que llama.

Cuestiones relacionadas