Implementé un grupo de subprocesos con boost::asio
y algunos números boost::thread
que llaman a boost::asio::io_service::run()
. Sin embargo, un requisito que me han dado es tener una forma de supervisar todos los hilos para "salud". Mi intención es hacer un simple objeto centinela que se pueda pasar a través del grupo de subprocesos; si se completa, podemos suponer que el subproceso aún está procesando el trabajo.boost :: asio, grupos de subprocesos y supervisión de subprocesos
Sin embargo, dada mi implementación, no estoy seguro de cómo (si) puedo controlar todos los subprocesos en el grupo de manera confiable. Simplemente he delegado la función de subproceso en boost::asio::io_service::run()
, por lo que publicar un objeto centinela en la instancia io_service
no garantiza qué subproceso realmente enviará 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 período de tiempo razonable, pero obviamente no es ideal.
Tome el siguiente ejemplo. Debido a la forma en que el manejador está codificado, en este caso podemos ver que cada hilo hará la misma cantidad de trabajo, pero en realidad no tendré control de la implementación del manejador, algunos pueden durar mucho tiempo mientras que otros serán 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;
}
puede agregar el código a su respuesta @Chad? –
Hecho. Feliz por cualquier comentario sobre él. – Chad