我需要的是一个线程安全的队列结构,其中多个客户端将数据转储到队列中,而一个工作线程继续处理并弹出队列
STL或Boost中是否存在完善的解决方案?
我现在考虑使用Boost :: threadpool来执行此操作。只需将并行线程数设置为1,每当新消息从客户端到达时,任务函数的输入参数都会更改。这是否有意义,是否有任何我尚未在此预期的限制?
答案 0 :(得分:12)
在boost中有一个message queue class,这就是你需要的:一个线程安全的队列。
消息队列是进程间通信的一种广泛使用的概念。消息队列是线程安全队列,其关键特性是它在从空队列读取时阻塞并等待数据出现在其中。在该boost类中,还支持定时等待,以及在队列已满时阻止编写器。
答案 1 :(得分:9)
如果在单个流程应用程序中需要这样的框架,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充当线程安全队列。
答案 2 :(得分:2)
如果您使用的是Windows,则可以在ppl.h中使用concurrent_queue(VS2010的新增功能)。如果您不在Windows上,可以在Intel的线程构建块中使用concurrent_queue.h。
Anthony Williams也有一个基于条件变量on his blog的队列,这很好。