簡體   English   中英

我可以使用boost :: threadpool作為'線程安全隊列'嗎?

[英]Can i use boost::threadpool as a 'thread-safe queue'?

我需要的是一個線程安全的隊列結構,其中多個客戶端不斷將數據轉儲到隊列中, 一個工作線程繼續處理和彈出隊列

在STL或Boost中是否存在任何完善的解決方案?

我現在考慮使用Boost :: threadpool來做到這一點。 只需將並行線程數設置為1,每當新消息從客戶端到達時,任務函數的輸入參數都會更改。 這是否有意義,是否有任何我尚未在此預期的限制?

在boost中有一個消息隊列類 ,這就是你需要的:一個線程安全的隊列。

消息隊列是進程間通信的一種廣泛使用的概念。 消息隊列是線程安全隊列,其關鍵特性是它在從空隊列讀取時阻塞並等待數據出現在其中。 在該boost類中,還支持定時等待,以及如果隊列已滿,則阻止編寫器。

如果在單個流程應用程序中需要這樣的框架,boost :: asio :: io_service就足夠了。 這是一個使用boost :: thread和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;


}

使用: - 實現IWorkerThreadJob接口。 從多個客戶端調用processJob方法。

這里boost :: asio :: io_service充當線程安全隊列。

如果您在Windows上,則可以在ppl.h中使用concurrent_queue(VS2010的新增功能)。 如果您不在Windows上,則可以在Intel的線程構建塊中使用concurrent_queue.h。

安東尼威廉姆斯在他的博客上也有一個基於條件變量的隊列,這很好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM