Итак, у меня есть пул потоков, который позволяет динамическое изменение размера и использует парадигму задачи.Интересно - когда люди получают такую вещь, они вообще перестают создавать потоки и просто все время используют задачи?Так обычно ли используется только пул потоков \ task-executor для создания потоков внутри моего класса?
мой пул потоков основан на boost :: asio :: io_service и работает с boost :: packaged_task .it - это только заголовок, имеющий boost 1.47.0, все, что вам нужно для работы, это timer , мой костюм thread_group и класс thread_pool .Было довольно забавно разрабатывать такую маленькую вещь, но теперь я стою перед дилеммой.
мои конструкции задач выглядят так:
boost::shared_ptr< boost::packaged_task<int> > task(new boost::packaged_task<int>( boost::bind(calculate_the_answer_to_life_the_universe_and_everything, argument_int_value )));
это довольно сложно, если я хочу создатьфункция, которая будет возвращать что-либо новее, будет иметь некоторый таймер повторного запуска (например, индексатор файлов, который должен каждые 5 секунд проверять, создал ли пользователь какой-либо новый файл в какой-либо папке)
, поэтому, например,:
void infinite_thread()
{
while(true)
{
timerForCaptureFame.restart();
do_stuff();
spendedTimeForCaptureFame = (int64_t)timerForCaptureFame.elapsed();
if (spendedTimeForCaptureFame < desiredTimeForCaptureFame)
boost::this_thread::sleep(boost::posix_time::milliseconds(desiredTimeForCaptureFame - spendedTimeForCaptureFame));
}
}
и я бы просто создал этот обертку в новый поток с кодом, подобным
boost::thread workerThread(infinite_thread);
Но теперь у меня могут быть задачи, чтобы он мог превратиться в
boost::shared_ptr< boost::packaged_task<void> > task(new boost::packaged_task<void>(infinite_thread));
task_manager->post<void>(task);
Мой менеджер задач через некоторое время обнаружил, что поток не закрывается и обычно добавляет к себе новый поток для выполнения, сохраняя этот рабочий.
Так что я действительно задаюсь вопросом, является ли это обычной практикойthread_pool / task_pool, чтобы использовать только его (например, по одному на класс) для создания потоков или люди смешивают там задачи с "чистыми" потоками?