boost :: asio, pule wątków i monitorowanie wątków

Zaimplementowałem pulę wątków za pomocąboost::asioi pewna liczbaboost::thread obiekty wzywająceboost::asio::io_service::run(). Jednak wymaganiem, które otrzymałem, jest sposób monitorowania wszystkich wątków pod kątem „zdrowia”. Moim zamiarem jest stworzenie prostego obiektu wartowniczego, który może być przekazywany przez pulę wątków - jeśli się to uda, możemy założyć, że wątek nadal przetwarza pracę.

Jednak biorąc pod uwagę moją implementację, nie jestem pewien, jak (jeśli) mogę niezawodnie monitorować wszystkie wątki w puli. Po prostu delegowałem funkcję wątku doboost::asio::io_service::run(), więc umieszczenie obiektu wartownika wio_service instancja nie gwarantuje, że wątek rzeczywiście otrzyma wartownika i wykona pracę.

Jedną z opcji może być okresowe wstawianie wartownika i mamy nadzieję, że zostanie on odebrany przez każdy wątek przynajmniej raz w rozsądnym czasie, ale to oczywiście nie jest idealne.

Weź następujący przykład. Ze względu na sposób kodowania programu obsługi, w tym przypadku widzimy, że każdy wątek wykona tyle samo pracy, ale w rzeczywistości nie będę miał kontroli nad implementacją programu obsługi, niektóre mogą być długie, podczas gdy inne będą prawie natychmiastowy.

#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;
}

questionAnswers(2)

yourAnswerToTheQuestion