2013-08-31 8 views
5

Ich benutze (single-threaded) a boost::asio:io_service, um eine Menge von TCP-Verbindungen zu behandeln. Für jede Verbindung verwende ich einen deadline_timer, um Timeouts zu erfassen. Wenn eine der Verbindungen das Zeitlimit überschreitet, kann ich keines der Ergebnisse der anderen Verbindungen verwenden. Daher möchte ich meinen io_service komplett neu starten. Ich dachte, dass das Aufrufen von io_service.stop() es ermöglichen würde, dass "beendete" Handler in der Warteschlange aufgerufen werden und Handler in der Warteschlange mit einem Fehler aufrufen würden.Klare boost :: asio :: io_service nach stop()

Es sieht jedoch so aus, als ob die Handler in der Warteschlange bleiben und daher ruft io_service.reset() und später io_service.run() die alten Handler wieder auf. Kann jemand bestätigen, dass die Handler tatsächlich in der Warteschlange bleiben, selbst nachdem io_service.stop() aufgerufen wird. Und wenn ja, welche Möglichkeiten gibt es, den io_service, z. Entfernen Sie alle Warteschlangenhandler?

Antwort

6

io_service::stop() und io_service::reset() nur den Zustand der io_service Ereignisschleife steuern; beeinflussen nicht die Lebensdauer von Handlern, die für verzögerte Aufruf- (bereit zum Ausführen) oder benutzerdefinierte Handlerobjekte geplant sind.

Die destructor für io_service bewirkt, dass alle noch offenen Handler zerstört werden:

  • Jedes Service-Objekt mit den io_service zugeordnet wird seine shutdown_service() Member-Funktion aufgerufen hat. Gemäß der Anforderung Service wird die Elementfunktion shutdown_service() alle Kopien von benutzerdefinierten Handler-Objekten zerstören, die von dem Dienst gehalten werden.
  • Nicht abgerufene Handlerobjekte, die für einen verzögerten Aufruf geplant sind, werden für den io_service und alle seine Stränge zerstört.

Betrachten Sie entweder:

  • Kontrolle der Lebensdauer des io_service Objekts. Ein Ansatz kann in this Antwort gefunden werden.
  • Ausführen der io_service zum Abschluss. Dies erfordert häufig das Festlegen des Status, das Abbrechen ausstehender Vorgänge und das Verhindern, dass Abschlussbehandler zusätzliche Arbeit in dem io_service veröffentlichen. Boost.Asio stellt ein offizielles timeout Beispiel bereit, und ein Timeout-Ansatz mit io_service zur Fertigstellung wird auch here gezeigt.
Verwandte Themen