2013-05-21 3 views
19

Я пытаюсь понять различные варианты использования. и разница между использованием двух потоков. This - отличный учебник, который я прочитал, что объясняет boost::thread_group.boost :: threadpool :: pool vs.boost :: thread_group

и вот код, я использую:

boost::threadpool::pool s_ThreadPool(GetCoreCount()); 

CFilterTask task(pFilter, // filter to run 
    boost::bind(&CFilterManagerThread::OnCompleteTask, this, _1, _2) // OnComplete sync callback   // _1 will be filter name // _2 will be error code 
       ); 

// schedule the new task - runs on the threadpool 
s_ThreadPool.schedule(task); 

это деструктор:

s_ThreadPool.wait(0); 

Пожалуйста, вы можете объяснить?

ответ

40

boost::thread_group - удобный класс для выполнения операций управления потоками в коллекции потоков. Например, вместо необходимости перебирать std::vector<boost::thread>, ссылаясь на join() на каждую нить, thread_group обеспечивает удобную функцию-член join_all().

С boost::thread, независимо от того, что он управляется boost::thread_group, срок службы нити часто зависит от работы, в которой работает нить. Например, если поток создан для выполнения дорогостоящего вычисления, то поток может выйти после вычисления результата. Если работа недолговечна, то накладные расходы на создание и уничтожение потоков могут повлиять на производительность.

С другой стороны, threadpool - это шаблон, в котором количество потоков обслуживает ряд задач/работы. Время жизни потока напрямую не связано с временем жизни задачи. Чтобы продолжить работу с предыдущим примером, приложение будет планировать вычисление дорогостоящего вычисления для запуска в пуле потоков. Работа будет поставлена ​​в очередь в threadpool, и один из потоков threadpool будет выбран для выполнения работы. По завершении вычисления поток вернется к ожиданию дополнительной работы, запланированной с помощью threadpool.

Как показано в этом примере threadpool, пул потоков может быть реализован с помощью boost::thread_group для управления временем жизни потоков и boost::asio::io_service для диспетчеризации задачи/работы.

+0

очень красиво объясненный ответ ... дает точную идею – spt025

Смежные вопросы