Так что я получил себе систему диспетчера задач threadpool.Должен ли я теперь использовать только его для создания всех потоков? - PullRequest
0 голосов
/ 30 августа 2011

Итак, у меня есть пул потоков, который позволяет динамическое изменение размера и использует парадигму задачи.Интересно - когда люди получают такую ​​вещь, они вообще перестают создавать потоки и просто все время используют задачи?Так обычно ли используется только пул потоков \ 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, чтобы использовать только его (например, по одному на класс) для создания потоков или люди смешивают там задачи с "чистыми" потоками?

1 Ответ

3 голосов
/ 30 августа 2011

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

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

...