Trong this blog Tôi đã tìm thấy một ví dụ khá gọn gàng về cách tạo một hồ bơi thread đơn giản bằng cách sử dụng boost :: asio. Về cơ bản, tôi muốn sử dụng nó như sau:Sử dụng boost :: asio thread pool cho các mục đích chung
#include <thread>
#include <functional>
#include <boost/asio.hpp>
int main (int argc, char* argv[]) {
asio::io_service io_service;
asio::io_service::work work(io_service);
std::vector<std::thread> threadPool;
for(size_t t = 0; t < std::thread::hardware_concurrency(); t++){
threadPool.push_back(thread(std::bind(&asio::io_service::run, &io_service)));
}
io_service.post(std::bind(an_expensive_calculation, 42));
io_service.post(std::bind(a_long_running_task, 123));
//Do some things with the main thread
io_service.stop();
for(std::thread& t : threadPool) {
t.join();
}
}
Boost :: asio, theo như tôi biết, chủ yếu được tạo cho mạng IO. Tuy nhiên, tôi chủ yếu muốn sử dụng nó cho các chức năng mục đích chung. Các vấn đề về tương tranh sẽ được áp dụng bằng cách sử dụng asio::io_service::strand
.
Vì vậy, câu hỏi của tôi: Có một ý tưởng hay khi tạo một nhóm luồng như thế này, ngay cả khi chương trình của tôi không sử dụng IO mạng? Có bất kỳ tổn thất hiệu suất rõ ràng nào so với việc triển khai nhóm luồng khác không? Nếu có, có triển khai tốt hơn cũng gọn gàng không?
boost :: thread support boost :: thread_group, bạn có thể sử dụng nó để nhóm chuỗi của bạn – StereoMatching