2013-01-10 26 views
9

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?

+0

boost :: thread support boost :: thread_group, bạn có thể sử dụng nó để nhóm chuỗi của bạn – StereoMatching

Trả lời

6

Boost.Asio không chỉ dành cho lập trình mạng, xem reference documentation. Nó có hỗ trợ mở rộng cho những thứ như

  • hoạt động dựa trên thời gian (deadline_timer)
  • xử lý
  • hoạt động nền tảng
  • cụ thể như suối posix và Windows tín hiệu xử lý

Tôi đã sử dụng nó cho khác mục đích trong một số ứng dụng là tốt. Một ví dụ là một nhóm luồng để dịch vụ có khả năng chạy các hoạt động cơ sở dữ liệu lâu dài trong khi cung cấp một giao diện không đồng bộ cho ứng dụng. Boost.Asio thực sự là một thư viện rất mạnh mẽ. Sử dụng nó cho một hồ bơi thread mục đích chung như bạn đề xuất có thể làm việc tốt.

3

Tôi không thấy bất kỳ lý do nào để không làm việc theo cách này. Như một lợi ích, bạn có thể sử dụng những thứ như thời hạn chót được xây dựng trên đầu trang của tăng :: asio.

2

Tôi đã viết một lớp ThreadPool với tăng asio. Nó hoạt động và nó sạch sẽ & đủ rõ ràng để dễ hiểu. ThreadPool with boost asio

Các vấn đề liên quan