这是从我的答案复制到另一个非常相似的帖子,希望对您有所帮助:
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_function
这是一个“ 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()
}