2010-01-06 26 views
9

Những gì tôi cần thực sự là một cấu trúc hàng đợi thread-safe, nơi nhiều khách hàng giữ cho dữ liệu bán phá giá vào hàng đợi và một làm việc chủ đề giữ chế biến và popping hàng đợiTôi có thể sử dụng boost :: threadpool như một 'hàng đợi an toàn' không?

được có bất kỳ giải pháp cũng như thành lập tồn tại trong STL hoặc Tăng cường?

Bây giờ tôi nghĩ về việc sử dụng Boost :: threadpool để thực hiện việc này. Đơn giản chỉ cần thiết lập số lượng các luồng song song là 1, tham số đầu vào của hàm tác vụ được thay đổi mỗi khi có thông báo mới đến từ một máy khách. Điều này có hợp lý không, có bất kỳ giới hạn nào mà tôi chưa dự đoán ở đây không?

Trả lời

12

Tăng cường có message queue class, đó là những gì bạn cần: hàng đợi an toàn theo chủ đề.

Hàng đợi thư là một khái niệm được sử dụng rộng rãi cho giao tiếp giữa các quá trình. Hàng đợi tin nhắn là hàng đợi an toàn theo chủ đề, tính năng chính là nó chặn đọc từ hàng đợi trống và đợi dữ liệu xuất hiện trong đó. Trong lớp tăng tốc đó, thời gian đợi cũng được hỗ trợ, cũng như chặn người viết nếu hàng đợi đầy.

+3

FYI, Hàng đợi thư yêu cầu dữ liệu phải có thể tuần tự nhị phân [ref] (http://www.boost.org/doc/libs/1_38_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.message_queue) . Vì vậy, sử dụng nó trong quá trình này không phải là cách thuận tiện nhất. _just thêm thông tin, chứ không phải trả lời_ –

9

Nếu bạn cần một khung như vậy trong một ứng dụng quy trình đơn lẻ, hãy tăng :: asio :: io_service phải đủ. Đây là một lớp mẫu hộp làm việc bằng cách sử dụng boost :: thread và boost :: asio :: io_service.

#include <boost/asio.hpp> 
#include <boost/bind.hpp> 
#include <boost/thread.hpp> 

class IWorkerThreadJob 
{ 
    public: 
     virtual ~IWorkerThreadJob(){}; 
     virtual void execute() = 0; 
}; 


class BoostBasedWorkingBox 
{ 
    public: 

     BoostBasedWorkingBox(): 
      m_IOServiceWork(m_IOService), // Give some work to io_service or else it will simply return from ::run method . 
      m_WorkerThread(boost::bind(&boost::asio::io_service::run, &m_IOService)) 
     {} 

     ~BoostBasedWorkingBox() 
     { 
      m_IOService.stop(); 
      m_WorkerThread.join(); 
     } 

     void processJob(IWorkerThreadJob* pJob) 
     { 
      m_IOService.post(boost::bind(&IWorkerThreadJob::execute,pJob)); 
     } 

    protected: 
     boost::thread m_WorkerThread; 
     boost::asio::io_service m_IOService; 
     boost::asio::io_service::work m_IOServiceWork; 


} 

Sử dụng: - Triển khai giao diện IWorkerThreadJob. Gọi phương thức processJob từ nhiều máy khách.

Tại đây tăng cường :: asio :: io_service đóng vai trò là hàng đợi an toàn cho chuỗi.

2

Nếu bạn sử dụng Windows, bạn có thể sử dụng concurrent_queue trong ppl.h (mới cho VS2010). Nếu bạn không ở trên các cửa sổ, bạn có thể sử dụng concurrent_queue.h trong các khối xây dựng chuỗi của Intel.

Anthony Williams cũng có hàng đợi dựa trên biến điều kiện on his blog.

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