Итак, я получил себе систему диспетчера задач threadpool. Должен ли я теперь использовать только его для создания всех потоков?

Итак, у меня есть пул потоков, который позволяет динамически изменять размер и использует парадигму задач. Интересно, когда люди получают такую ​​вещь, они вообще перестают создавать потоки вручную и просто все время используют задачи? Итак, обычно ли для создания потоков внутри моего класса используется только пул потоков\задача-исполнитель?


мой пул потоков основан на 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 для использования только его (например, по одному на класс) для создания потоков, или люди смешивают там задачи с «чистыми» потоками?


person Rella    schedule 30.08.2011    source источник


Ответы (1)


Нет четкого ответа. Могут быть вещи, которые кажутся более подходящими для обычных потоков и не совсем соответствуют парадигме task, например потоки, которые должны длиться в течение всей продолжительности программы, или которые могут пережить пул потоков. . Если его никогда не вернут в бассейн, вы можете обращаться с ним как с отдельной вещью.

Опять же, поскольку у вас уже есть пул потоков, вы можете просто принудительно сделать все потоки задачами, даже если они являются бесконечно длинными задачами... но остерегайтесь закон инструмента. Может показаться, что каждая работа — это задача/гвоздь в ваш новый пул/золотой молоток.

person David Rodríguez - dribeas    schedule 30.08.2011