2010-02-24 12 views

Odpowiedz

29

Cóż, to zależy od kontekstu rozmowy, to znaczy jest on prowadzony od wewnątrz io_service lub bez:

  • post nie wywoła funkcję bezpośrednio, nigdy, ale odłożyć rozmowę.
  • dispatch pokaże to od razu, jeśli wywołanie-wywołanie zostało wywołane z io_service, ale kolejce w przeciwnym razie.

Tak, to zależy od funkcji wywołującej wywołanie/wysyłkę i czy dany handler może zostać wywołany od razu, czy też nie.

Co to oznacza:

... jest to, że w końcu znowu dispatch może wywołać kod (oczywiście to zależy od aplikacji i jak łańcuch połączeń), ale generalnie należy upewnić się, że oddzwanianie jest ponownie wprowadzane, jeśli używasz dispatch.

dispatch jest zatem szybsza, ponieważ pozwala uniknąć kolejkowania połączeń, jeśli to możliwe. Zawiera pewne zastrzeżenia, więc możesz potrzebować od czasu do czasu korzystać z post lub zawsze (jeśli chcesz grać bezpiecznie i na to stać).

Aktualizacja

Aby włączyć niektóre z usuniętym odpowiedź @gimpf „s, starsza wersja doładowania miał ten realizację wysyłki (moje uwagi):

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

Co masz na myśli przez ~ "** nie wywoła funkcji bezpośrednio, nigdy ** Jak zadzwoni funkcja? –

+1

@IgorGanapolsky: Przez * bezpośrednio * rozumiem jako potomek" posterunku "() "Zadzwoń do ciebie" Zamiast tego będzie on wywoływany pośrednio, ponieważ wywołujesz metodę poll() lub podobną metodę z najwyższą pętlą, która sprawdza, czy jest jakaś praca do wykonania (wywołania do wysłania, liczniki czasu, które wygasły) lub nowe dane na gniazdach itp.). – Macke

9

widzieć tego wpisu:
To post or to dispatch? - This Thread

Uruchomienie aplikacji spowoduje wyświetlenie różnicy między publikowaniem a wysyłanie. Ponieważ może to zrobić, funkcja dispatch() wykonałaby bezpośrednio fB() , więc zobaczymy, że działa ona w bieżącym wątku, a synchronizuje się z . Z drugiej strony, post() poprosiłby o io_service, aby wykonała zadanie, asynchronicznie w innym wątku, i natychmiast zwraca kontrolę do osoby dzwoniącej.

Powiązane problemy