Это скопировано из моего ответа на другой очень похожий пост, надеюсь, это поможет:
1) Начните с максимального количества потоков, которое может поддерживать система:
int Num_Threads = thread::hardware_concurrency();
2) Для эффективной реализации пула потоков после создания потоков в соответствии с Num_Threads лучше не создавать новые и не уничтожать старые (путем присоединения). Это приведет к снижению производительности, может даже сделать ваше приложение медленнее, чем последовательная версия.
Каждый поток C ++ 11 должен выполняться в своей функции с бесконечным циклом, постоянно ожидая захвата и запуска новых задач.
Вот как прикрепить такую функцию к пулу потоков:
int Num_Threads = thread::hardware_concurrency();
vector<thread> Pool;
for(int ii = 0; ii < Num_Threads; ii++)
{ Pool.push_back(thread(Infinite_loop_function));}
3) Функция Infinite_loop_function
Это цикл while (true), ожидающий очереди задач
void The_Pool:: Infinite_loop_function()
{
while(true)
{
{
unique_lock<mutex> lock(Queue_Mutex);
condition.wait(lock, []{return !Queue.empty() || terminate_pool});
Job = Queue.front();
Queue.pop();
}
Job(); // function<void()> type
}
};
4) Сделайте функцию для добавления работы в вашу очередь
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) Привяжите произвольную функцию к вашей очереди
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
После интеграции этих компонентов у вас будет собственный динамический пул потоков. Эти потоки всегда выполняются, ожидая выполнения задания.
Прошу прощения, если есть какие-то синтаксические ошибки, я набрал этот код и у меня плохая память. Извините, что я не могу предоставить вам полный код пула потоков, это нарушит мою честность работы.
Изменить: чтобы завершить работу пула, вызовите метод shutdown ():
XXXX::shutdown(){
{
unique_lock<mutex> lock(threadpool_mutex);
terminate_pool = true;} // use this flag in condition.wait
condition.notify_all(); // wake up all threads.
// Join all threads.
for(std::thread &every_thread : thread_vector)
{ every_thread.join();}
thread_vector.clear();
stopped = true; // use this flag in destructor, if not set, call shutdown()
}