Итак, у меня есть пул потоков, который позволяет динамически изменять размер и использует парадигму задач. Интересно, когда люди получают такую вещь, они вообще перестают создавать потоки вручную и просто все время используют задачи? Итак, обычно ли для создания потоков внутри моего класса используется только пул потоков\задача-исполнитель?
мой пул потоков основан на boost::asio::io_service и работает с boost::packaged_task. Это только заголовок, и для этого есть boost 1.47.0. для работы являются таймер, мой костюм 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 для использования только его (например, по одному на класс) для создания потоков, или люди смешивают там задачи с «чистыми» потоками?