2012-11-04 22 views

Antwort

9

Die io_service::run() führt Operationen aus, solange asynchrone Operationen ausgeführt werden. Wenn zu irgendeinem Zeitpunkt keine asynchronen Operationen anstehen (oder Handler aufgerufen werden), wird der Aufruf run() zurückgeben.

Es gibt jedoch einige Designs, die bevorzugen würden, dass der run() Anruf nicht beendet, bis alle Arbeit erledigt ist UND die io_service ausdrücklich angewiesen wurde, dass es in Ordnung ist, zu beenden. Dafür wird io_service::work verwendet. Durch das Erstellen des work Objekts (ich mache es normalerweise auf dem Heap und einem shared_ptr), sieht sich der io_service selbst immer etwas ausstehend, und deshalb wird die run() Methode nicht zurückkehren. Sobald ich möchte, dass der Dienst beendet werden kann (normalerweise während des Herunterfahrens), werde ich das Arbeitsobjekt zerstören.

+0

Zerstören wie mit reset()? – lucastamoios

+2

Normalerweise, wenn ich eine shared_ptr zu arbeiten, dann ja, ich rufe 'reset()' auf der shared_ptr. –

6

io_service::work ist Basisklasse aller Arbeiten, die auf eine Instanz io_service geschrieben kann zum Beispiel, wenn Sie mit einer Steckdose und starten Sie einen asynchronen Lese arbeiten, sind Sie eigentlich ein work zum io_service hinzufügen. Also nie work Sie normalerweise verwenden, um direkt, aber es gibt eine Ausnahme:

io_service::run zurückkehren wird, sobald es nicht mehr Arbeit zu tun, so sollten Sie eine Anwendung, die einige Erzeuger und Verbraucher Threads, Hersteller gelegentlich produzieren Werke und poste sie an Consumer-Threads mit io_service::post, aber wenn alle Arbeiten abgeschlossen sind, dann io_service::run wird zurückkehren und möglicherweise wird Ihr Consumer-Thread gestoppt, so dass Sie eine beliebige Arbeit benötigen, um io_service beschäftigt zu halten, in diesem Fall können Sie io_service::work direkt verwenden.