Ich möchte einen Signalhandler zu meinem boost io_service hinzufügen, damit die Anwendung sauber heruntergefahren werden kann, wenn der Benutzer Strg-C drückt. Das ist natürlich leicht durch Anhalten der Schleife, so etwas getan:Boost asio-Handler, der den io_service nicht laufen lässt
boost::asio::io_service service;
boost::asio::signal_set signals{ service, SIGINT, SIGTERM };
signals.async_wait(std::bind(&boost::asio::io_service::stop, &service));
Dadurch wird die Schleife normal hält, so dass die Destruktoren ihre Routine clean-up Verhalten zu tun.
Das Problem ist, sobald die Anwendung keine Arbeit mehr hat, hört es nicht auf, weil der Signalhandler noch einen Handler registriert hat und somit der io_service nie aufhört zu laufen.
Ich habe keinen sauberen Weg gefunden. Ich könnte natürlich die Signalverarbeitung selbst durchführen und dann einfach die Schleife stoppen, aber diese Art von Idee vereitelt die Idee, Boost (Portabilität) zu verwenden.
Warum kann die Anwendung rufe 'signals.cancel()' auf, wenn es keine Arbeit mehr hat? – kenba
Weil die Anwendung nicht weiß, wenn es keine Arbeit mehr hat. Der einzige, der weiß, ob mehr Arbeit zur Verfügung steht, ist der io_service. –
Verwenden Sie 'io_service' als Thread-Pool? Was machst du genau? –