boost :: asio, agrupaciones de hilos y monitorización de hilos

He implementado un grupo de subprocesos utilizandoboost::asioy algun numeroboost::thread objetos que llamanboost::asio::io_service::run(). Sin embargo, un requisito que me han dado es tener una forma de monitorear todos los subprocesos en busca de "salud". Mi intención es hacer un objeto centinela simple que se pueda pasar a través del conjunto de subprocesos; si lo logra, podemos asumir que el subproceso aún está procesando trabajo.

Sin embargo, dada mi implementación, no estoy seguro de cómo (si) puedo monitorear todos los subprocesos en el grupo de manera confiable. Simplemente he delegado la función de hilo aboost::asio::io_service::run(), por lo que publicar un objeto centinela en elio_service La instancia no garantiza qué hilo realmente obtendrá ese centinela y hará el trabajo.

Una opción puede ser simplemente insertar periódicamente el centinela, y esperar que sea recogido por cada hilo al menos una vez en un tiempo razonable, pero eso obviamente no es lo ideal.

Tomemos el siguiente ejemplo. Debido a la forma en que el manejador está codificado, en este caso podemos ver que cada subproceso realizará la misma cantidad de trabajo, pero en realidad no tendré control de la implementación del manejador, algunos pueden durar mucho tiempo y otros casi inmediato.

#include <iostream>
#include <boost/asio.hpp>
#include <vector>
#include <boost/thread.hpp>
#include <boost/bind.hpp>

void handler()
{
   std::cout << boost::this_thread::get_id() << "\n";
   boost::this_thread::sleep(boost::posix_time::milliseconds(100));
}

int main(int argc, char **argv)
{
   boost::asio::io_service svc(3);

   std::unique_ptr<boost::asio::io_service::work> work(new boost::asio::io_service::work(svc));

   boost::thread one(boost::bind(&boost::asio::io_service::run, &svc));
   boost::thread two(boost::bind(&boost::asio::io_service::run, &svc));
   boost::thread three(boost::bind(&boost::asio::io_service::run, &svc));

   svc.post(handler);
   svc.post(handler);
   svc.post(handler);
   svc.post(handler);
   svc.post(handler);
   svc.post(handler);
   svc.post(handler);
   svc.post(handler);
   svc.post(handler);
   svc.post(handler);

   work.reset();

   three.join();
   two.join();
   one.join();

   return 0;
}

Respuestas a la pregunta(2)

Su respuesta a la pregunta