[英]How can I make a third-party library thread-safe for use with Boost threads?
[英]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.