Điều này được sao chép từ câu trả lời của tôi sang một bài viết rất giống nhau, hy vọng nó có thể giúp:
1) Bắt đầu với số lượng luồng tối đa mà hệ thống có thể hỗ trợ:
int Num_Threads = thread::hardware_concurrency();
2) Để triển khai luồng dữ liệu hiệu quả, một khi các luồng được tạo theo Num_Threads, tốt hơn là không tạo các luồng mới hoặc phá hủy các luồng cũ (bằng cách nối). Sẽ có hình phạt hiệu suất, thậm chí có thể làm cho ứng dụng của bạn chạy chậm hơn phiên bản nối tiếp.
Mỗi luồng C ++ 11 phải được chạy trong chức năng của chúng với một vòng lặp vô hạn, liên tục chờ đợi các tác vụ mới để lấy và chạy.
Dưới đây là cách gắn chức năng đó vào nhóm luồng:
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_feft
Đây là một vòng lặp "while (true)" đang chờ hàng đợi tác vụ
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) Tạo một chức năng để thêm công việc vào Hàng đợi của bạn
void The_Pool:: Add_Job(function<void()> New_Job)
{
{
unique_lock<mutex> lock(Queue_Mutex);
Queue.push(New_Job);
}
condition.notify_one();
}
5) Liên kết một hàm tùy ý vào Hàng đợi của bạn
Pool_Obj.Add_Job(std::bind(&Some_Class::Some_Method, &Some_object));
Khi bạn tích hợp các thành phần này, bạn có nhóm luồng động của riêng bạn. Những chủ đề này luôn luôn chạy, chờ công việc để làm.
Tôi xin lỗi nếu có một số lỗi cú pháp, tôi đã gõ các mã này và tôi có một bộ nhớ xấu. Xin lỗi rằng tôi không thể cung cấp cho bạn mã nhóm hoàn chỉnh, điều đó sẽ vi phạm tính toàn vẹn công việc của tôi.
Chỉnh sửa: để chấm dứt nhóm, gọi phương thức 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()
}