Це скопійовано з моєї відповіді на інший дуже схожий пост, сподіваюся, що це може допомогти:
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_
Це цикл "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()
}