Ini disalin dari jawaban saya ke posting lain yang sangat mirip, semoga bisa membantu:
1) Mulai dengan jumlah utas maksimum yang dapat didukung sistem:
int Num_Threads = thread::hardware_concurrency();
2) Untuk implementasi threadpool yang efisien, setelah utas dibuat sesuai dengan Num_Threads, lebih baik tidak membuat yang baru, atau menghancurkan yang lama (dengan bergabung). Akan ada penalti kinerja, bahkan mungkin membuat aplikasi Anda berjalan lebih lambat daripada versi serial.
Setiap utas C ++ 11 harus menjalankan fungsinya dengan loop tak terbatas, terus-menerus menunggu tugas baru untuk diraih dan dijalankan.
Berikut ini cara melampirkan fungsi tersebut ke kumpulan utas:
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) Fungsi Infinite_loop_
Ini adalah loop "while (true)" menunggu antrian tugas
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) Buat fungsi untuk menambahkan pekerjaan ke Antrian Anda
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) Bind fungsi sewenang-wenang ke Antrian Anda
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
Setelah Anda mengintegrasikan bahan-bahan ini, Anda memiliki kolam threading dinamis Anda sendiri. Utas ini selalu berjalan, menunggu pekerjaan selesai.
Saya minta maaf jika ada beberapa kesalahan sintaksis, saya mengetik kode ini dan dan saya memiliki memori yang buruk. Maaf bahwa saya tidak dapat memberikan Anda kode kumpulan utas lengkap, yang akan melanggar integritas pekerjaan saya.
Edit: untuk menghentikan pool, panggil metode 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()
}