Ceci est copié de ma réponse dans un autre article très similaire, j'espère que cela pourra vous aider:
1) Commencez avec le nombre maximum de threads qu'un système peut prendre en charge:
int Num_Threads = thread::hardware_concurrency();
2) Pour une implémentation efficace de threadpool, une fois que les threads sont créés selon Num_Threads, il vaut mieux ne pas en créer de nouveaux, ni détruire les anciens (en les rejoignant). Il y aura une pénalité de performance, peut même ralentir votre application par rapport à la version série.
Chaque thread C ++ 11 doit être exécuté dans sa fonction avec une boucle infinie, attendant constamment de nouvelles tâches à saisir et à exécuter.
Voici comment attacher une telle fonction au pool de threads:
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 fonction_loop_infini
Il s'agit d'une boucle "while (true)" attendant la file d'attente des tâches
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) Créez une fonction pour ajouter un travail à votre file d'attente
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) Liez une fonction arbitraire à votre file d'attente
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
Une fois que vous avez intégré ces ingrédients, vous disposez de votre propre pool de threads dynamique. Ces threads s'exécutent toujours, en attente de travail.
Je m'excuse s'il y a des erreurs de syntaxe, j'ai tapé ces codes et j'ai une mauvaise mémoire. Désolé de ne pas pouvoir vous fournir le code complet du pool de threads, car cela violerait l'intégrité de mon travail.
Edit: pour terminer le pool, appelez la méthode 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()
}