นี่คัดลอกมาจากคำตอบของฉันไปยังโพสต์อื่นที่คล้ายกันมากหวังว่ามันจะช่วยได้:
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()
}