Esto se copia de mi respuesta a otra publicación muy similar, espero que pueda ayudar:
1) Comience con el número máximo de subprocesos que un sistema puede admitir:
int Num_Threads = thread::hardware_concurrency();
2) Para una implementación eficiente de conjunto de subprocesos, una vez que los subprocesos se crean de acuerdo con Num_Threads, es mejor no crear nuevos o destruir los antiguos (uniéndose). Habrá una penalización de rendimiento, incluso podría hacer que su aplicación vaya más lenta que la versión en serie.
Cada subproceso de C ++ 11 debe ejecutarse en su función con un bucle infinito, esperando constantemente que se lleven a cabo nuevas tareas.
Aquí se explica cómo adjuntar dicha función al grupo de subprocesos:
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) La función de bucle infinito
Este es un ciclo "while (verdadero)" que espera la cola de tareas
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) Haga una función para agregar trabajo a su cola
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) Vincula una función arbitraria a tu Cola
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
Una vez que integre estos ingredientes, tiene su propio grupo dinámico de subprocesos. Estos subprocesos siempre se ejecutan, esperando el trabajo que hacer.
Pido disculpas si hay algunos errores de sintaxis, escribí este código y tengo mala memoria. Lamento no poder proporcionarle el código completo del grupo de subprocesos, eso violaría la integridad de mi trabajo.
Editar: para terminar el grupo, llame al método 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()
}