Asio ライブラリの io_context クラスについて ================================================== `Asio ライブラリ `_ において、非同期処理を行うのに使用する io_context クラスについて、 使ってみて困った点をまとめておく。 勝手に run 関数が終了する ------------------------------ 非同期処理を開始させるために、 .. code-block:: cpp asio::io_context context; // 必要に応じた初期化処理 context.run(); のような処理を書くが、 イベント処理を行う ``context.run()`` が知らない内に終了し、 何も処理が行われなくなるケースがあった。 これは、仕事がなくなったら run 関数を抜けるという仕様によるもので、 基本的には run 関数を呼ぶ前に最初の非同期処理を初めておくものだった。 なお、何も仕事のない時間でも run 関数を動作させておきたい場合 (依頼された通信を行うクライアントクラスとか)、 run 関数が終わらないようにする ``executor_work_guard`` クラスというのがある。 `公式ドキュメント `_ の例を参照すると、 .. code-block:: cpp asio::io_context io_context; asio::executor_work_guard work = asio::make_work_guard(io_context); のようにすると、``io_context.stop()`` か ``work.reset()`` を実行するまで 「仕事がない」という扱いにはならないと書いてある。