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