Dies wird von meiner Antwort auf einen anderen sehr ähnlichen Beitrag kopiert, hoffe es kann helfen:
1) Beginnen Sie mit der maximalen Anzahl von Threads, die ein System unterstützen kann:
int Num_Threads = thread::hardware_concurrency();
2) Für eine effiziente Threadpool-Implementierung ist es besser, nach dem Erstellen von Threads gemäß Num_Threads keine neuen zu erstellen oder alte zu zerstören (durch Verbinden). Dies führt zu Leistungseinbußen und kann sogar dazu führen, dass Ihre Anwendung langsamer als die serielle Version wird.
Jeder C ++ 11-Thread sollte in seiner Funktion mit einer Endlosschleife ausgeführt werden und ständig darauf warten, dass neue Aufgaben erfasst und ausgeführt werden.
So fügen Sie eine solche Funktion dem Thread-Pool hinzu:
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) Die Infinite_loop_function
Dies ist eine "while (true)" - Schleife, die auf die Task-Warteschlange wartet
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) Erstellen Sie eine Funktion, um Ihrer Warteschlange einen Job hinzuzufügen
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) Binden Sie eine beliebige Funktion an Ihre Warteschlange
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
Sobald Sie diese Zutaten integriert haben, haben Sie Ihren eigenen dynamischen Threading-Pool. Diese Threads werden immer ausgeführt und warten auf die Ausführung des Jobs.
Ich entschuldige mich, wenn es einige Syntaxfehler gibt, ich habe diesen Code eingegeben und ich habe ein schlechtes Gedächtnis. Es tut mir leid, dass ich Ihnen nicht den vollständigen Thread-Pool-Code zur Verfügung stellen kann, der meine Jobintegrität verletzen würde.
Bearbeiten: Um den Pool zu beenden, rufen Sie die Methode shutdown () auf:
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()
}