Questo è copiato dalla mia risposta a un altro post molto simile, spero che possa aiutare:
1) Inizia con il numero massimo di thread che un sistema può supportare:
int Num_Threads = thread::hardware_concurrency();
2) Per un'implementazione efficiente di threadpool, una volta creati i thread in base a Num_Threads, è meglio non crearne di nuovi o distruggere quelli vecchi (unendosi). Ci sarà una penalità per le prestazioni, potrebbe persino rallentare l'applicazione rispetto alla versione seriale.
Ogni thread C ++ 11 dovrebbe essere in esecuzione nella loro funzione con un ciclo infinito, in costante attesa di nuove attività da afferrare ed eseguire.
Ecco come associare tale funzione al pool di thread:
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 funzione Infinite_loop_
Questo è un ciclo "while (true)" in attesa della coda delle attività
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) Crea una funzione per aggiungere lavoro alla tua coda
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) Associa una funzione arbitraria alla tua coda
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
Una volta integrati questi ingredienti, hai il tuo pool di threading dinamico. Questi thread vengono sempre eseguiti, in attesa del completamento del lavoro.
Mi scuso se ci sono alcuni errori di sintassi, ho digitato questi codici e ho una brutta memoria. Spiacenti, non posso fornirti il codice completo del pool di thread, che violerebbe l'integrità del mio lavoro.
Modifica: per terminare il pool, chiamare il metodo 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()
}