2013-08-31 18 views
5

Używam (pojedynczego wątku) a boost::asio:io_service do obsługi wielu połączeń TCP. Dla każdego połączenia używam parametru deadline_timer do przechwytywania limitów czasu. Jeśli którekolwiek z połączeń przekroczy limit czasu, nie mogę użyć żadnego z wyników innych połączeń. Dlatego chcę całkowicie zrestartować moje io_service. Pomyślałem, że wywołanie io_service.stop() pozwoliłoby na wywołanie "zakończonych" procedur obsługi w kolejce i wywołanie procedur obsługi w kolejce z błędem.Wyczyść doładowanie :: asio :: io_service after stop()

Wygląda jednak na to, że moduły obsługi pozostają w kolejce i dlatego wywołanie io_service.reset() i późniejszego io_service.run() przywraca stare procedury obsługi. Czy ktoś może potwierdzić, że procedury obsługi rzeczywiście pozostają w kolejce, nawet po wywołaniu io_service.stop(). A jeśli tak, jakie są możliwości pełnego zresetowania usługi io_, np. usunąć wszystkie kolejki obsługi?

Odpowiedz

6

io_service::stop() i kontrolować tylko stan pętli zdarzeń io_service; ani nie wpływają na żywotność procedur obsługi zaplanowanych na odroczone wywoływanie (gotowe do uruchomienia) lub obiekty obsługi zdefiniowane przez użytkownika.

destructor dla io_service spowoduje, że wszystkie zaległe koparki zostać zniszczone:

  • Każdy obiekt usługi związane z io_service będzie mieć jego funkcja shutdown_service() członkiem wywoływany. Zgodnie z wymaganiami typu Service funkcja członkowska shutdown_service() zniszczy wszystkie kopie obiektów obsługi zdefiniowanych przez użytkownika, które są utrzymywane przez usługę.
  • Obiekty nieobsługiwanego przewodnika zaplanowane na odroczoną inwokację są niszczone dla io_service i dowolnego z jej wątków.

Rozważmy albo:

  • Controlling żywotność obiektu io_service. Jedno podejście można znaleźć w odpowiedzi: this.
  • Uruchamianie io_service do zakończenia. Często wymaga to ustawienia stanu, anulowania zaległych operacji i uniemożliwienia procedur obsługi ukończenia z dodania dodatkowej pracy do io_service. Boost.Asio dostarcza oficjalny przykład: timeout, a podejście z przekroczeniem limitu czasu z uruchomieniem do io_service do zakończenia jest również wyświetlane here.
Powiązane problemy