boost :: asio, pule wątków i monitorowanie wątków
Zaimplementowałem pulę wątków za pomocąboost::asio
i 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;
}