boost :: asio, пулы потоков и мониторинг потоков

Я реализовал пул потоков, используяboost::asioи некоторый номерboost::thread вызов объектовboost::asio::io_service::run(), Однако требование, которое мне было дано, состоит в том, чтобы иметь возможность контролировать все потоки на предмет "здоровья". Мое намерение состоит в том, чтобы создать простой сторожевой объект, который можно было бы передать через пул потоков - если он это сделает, то мы можем предположить, что поток все еще обрабатывает работу.

Однако, учитывая мою реализацию, я не уверен, как (если) я могу надежно контролировать все потоки в пуле. Я просто делегировал функцию потокаboost::asio::io_service::run(), поэтому размещение объекта стража вio_service экземпляр не гарантирует, какой поток действительно получит этого стража и выполнит работу.

Один из вариантов может состоять в том, чтобы просто периодически вставлять часового и надеяться, что он будет подхвачен каждым потоком хотя бы один раз за некоторое разумное время, но это, очевидно, не идеально.

Возьмите следующий пример. Из-за того, как обработчик закодирован, в этом случае мы можем видеть, что каждый поток будет выполнять одинаковый объем работы, но на самом деле я не буду контролировать реализацию обработчика, некоторые могут работать долго, а другие будут почти незамедлительной.

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

Ответы на вопрос(2)

Ваш ответ на вопрос