Ich bin neu in Boost-Programmierung, und ich habe nach einem Grund gesucht, die io_service::work
zu verwenden, aber ich kann es nicht herausfinden; in einigen meiner Tests habe ich es entfernt und funktioniert in Ordnung.Warum sollte ich io_service :: work verwenden?
Antwort
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.
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.
Zerstören wie mit reset()? – lucastamoios
Normalerweise, wenn ich eine shared_ptr zu arbeiten, dann ja, ich rufe 'reset()' auf der shared_ptr. –