0
ブーストio_serviceにシグナルハンドラを追加して、ユーザがCtrl-Cを押したときにアプリケーションをきれいにシャットダウンできるようにします。これは、もちろん簡単に、ループを停止することによって、このような何かをやっている:io_serviceの実行を維持しないブーストasioハンドラ
boost::asio::io_service service;
boost::asio::signal_set signals{ service, SIGINT, SIGTERM };
signals.async_wait(std::bind(&boost::asio::io_service::stop, &service));
これは、デストラクタは、日常のクリーンアップ動作を行うためにできるように、通常はループを停止します。
問題が発生すると、シグナルハンドラに登録されたハンドラがまだ存在し、io_serviceが実行を停止しないため、アプリケーションの作業が終了するとアプリケーションは停止しません。
私はこれをきれいに見つけられませんでした。もちろん、自分自身でシグナルを処理してループを止めることもできますが、この種の方法はboost(移植性)を使うという考え方に反するものです。
できないのはなぜアプリケーション
io_service
はありませんより多くの仕事を持っているし、実行を停止してhttp_server.shutdown()
機能は、リスニングソケットと、開いているすべての接続を閉じます作業がなくなったときに 'signals.cancel()'を呼び出します。 – kenbaこのアプリケーションでは、作業が不足したときはわかりません。より多くの作業が利用可能かどうかを知る唯一のものは、io_serviceです。 –
'io_service'をスレッドプールとして使用していますか?何を正確にしていますか? –