複数の io_services で boost:asio を使用して、さまざまな形式のブロッキング I/O を分離しています。たとえば、ファイル I/O をブロックするための io_service と、長時間実行される CPU バウンド タスク用の io_service があります (ネットワーク I/O をブロックするために、これを 3 分の 1 に拡張することもできます)。 I/O をブロックしても、他の I/O が不足することはありません。
私が抱えている問題は、ある io_service で実行されているタスクがイベントを他の io_service に投稿できるためです (たとえば、CPU にバインドされたタスクがファイル I/O 操作を開始する必要があるか、完了したファイル I/O 操作が CPU を呼び出す可能性があります)。バインドされたコールバック)、両方の io_services がイベントを終了するまで、両方の io_services を実行し続ける方法がわかりません。
通常、単一の I/O サービスでは、次のようにします。
shared_ptr<asio::io_service> io_service (new asio::io_service);
shared_ptr<asio::io_service::work> work (
new asio::io_service::work(*io_service));
// Create worker thread(s) that call io_service->run()
io_service->post(/* some event */);
work.reset();
// Join worker thread(s)
ただし、単純に両方の io_services に対してこれを行うと、最初のイベントを投稿しなかった io_services がすぐに終了します。また、最初のイベントを両方に投稿したとしても、io_service A のタスクが B に新しいイベントを投稿する前に io_service B の最初のイベントが終了すると、io_service B は途中で終了します。
io_service A がまだイベントを処理している間 (サービス A のキューに入れられたイベントの 1 つが B に新しいイベントを投稿する可能性があるため)、io_service B を実行し続けるにはどうすればよいですか? また、その逆も同様です。両方が同時にイベントから外れている場合はどうなりますか?