boost :: asio, Threadpools und Threadüberwachung

Ich habe einen Thread-Pool mit implementiertboost::asiound eine Nummerboost::thread Objekte aufrufenboost::asio::io_service::run(). Eine Anforderung, die mir gestellt wurde, ist es jedoch, alle Threads auf "Gesundheit" zu überwachen. Meine Absicht ist es, ein einfaches Sentinel-Objekt zu erstellen, das durch den Thread-Pool geleitet werden kann. Wenn es durchkommt, können wir davon ausgehen, dass der Thread noch in Bearbeitung ist.

Aufgrund meiner Implementierung bin ich mir jedoch nicht sicher, wie (wenn) ich alle Threads im Pool zuverlässig überwachen kann. Ich habe einfach die Thread-Funktion an delegiertboost::asio::io_service::run(), so dass ein Sentinel-Objekt in dieio_service Die Instanz kann nicht garantieren, welcher Thread den Sentinel tatsächlich abruft und die Arbeit erledigt.

Eine Möglichkeit könnte sein, den Sentinel nur in regelmäßigen Abständen einzufügen und zu hoffen, dass er von jedem Thread mindestens einmal in angemessener Zeit aufgenommen wird, aber das ist offensichtlich nicht ideal.

Nehmen Sie das folgende Beispiel. Aufgrund der Art und Weise, wie der Handler codiert ist, können wir in diesem Fall sehen, dass jeder Thread dieselbe Menge an Arbeit erledigen wird, aber in Wirklichkeit habe ich keine Kontrolle über die Handlerimplementierung, einige können lange ausgeführt werden, während andere fast ausgeführt werden sofortig.

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage