Ho implementato un pool di thread utilizzando boost::asio
e alcuni oggetti boost::thread
chiamando boost::asio::io_service::run()
. Tuttavia, un requisito che mi è stato dato è di avere un modo per monitorare tutti i thread per "salute". Il mio intento è quello di creare un oggetto sentinella semplice che possa essere passato attraverso il pool di thread: se lo supera, possiamo supporre che il thread stia ancora elaborando il lavoro.boost :: asio, pool di thread e monitoraggio thread
Tuttavia, data la mia implementazione, non sono sicuro di come (se) posso controllare tutti i thread nel pool in modo affidabile. Ho semplicemente delegato la funzione thread a boost::asio::io_service::run()
, quindi l'invio di un oggetto sentinella nell'istanza io_service
non garantisce quale thread effettivamente riceverà quel sentinel e farà il lavoro.
Un'opzione può essere quella di inserire periodicamente la sentinella e sperare che venga catturata da ciascun thread almeno una volta in un ragionevole lasso di tempo, ma ovviamente non è l'ideale.
Prendete il seguente esempio. A causa del modo in cui il gestore è codificato, in questo caso possiamo vedere che ogni thread farà la stessa quantità di lavoro, ma in realtà non avrò il controllo dell'implementazione del gestore, alcuni possono essere di lunga durata mentre altri saranno quasi immediato.
#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;
}
puoi aggiungere il codice alla tua risposta @Chad? –
Fatto. Felice per qualsiasi feedback su di esso. – Chad