C++ 我可以将boost::threadpool用作';线程安全队列';?
我需要的实际上是一个线程安全的队列结构,其中多个客户端不断将数据转储到队列中,一个工作线程不断处理和弹出队列 STL或Boost中是否存在任何成熟的解决方案 我现在考虑使用Boost::threadpool来实现这一点。只需将并行线程数设置为1,每次从客户端收到新消息时,任务函数的输入参数都会更改。这有意义吗?这里有我还没有预料到的限制吗?在boost中有一个,这就是您需要的:线程安全队列C++ 我可以将boost::threadpool用作';线程安全队列';?,c++,multithreading,boost,message-queue,threadpool,C++,Multithreading,Boost,Message Queue,Threadpool,我需要的实际上是一个线程安全的队列结构,其中多个客户端不断将数据转储到队列中,一个工作线程不断处理和弹出队列 STL或Boost中是否存在任何成熟的解决方案 我现在考虑使用Boost::threadpool来实现这一点。只需将并行线程数设置为1,每次从客户端收到新消息时,任务函数的输入参数都会更改。这有意义吗?这里有我还没有预料到的限制吗?在boost中有一个,这就是您需要的:线程安全队列 消息队列是进程间通信中广泛使用的概念。消息队列是线程安全队列,其关键特性是它阻止从空队列读取数据,并等待数
消息队列是进程间通信中广泛使用的概念。消息队列是线程安全队列,其关键特性是它阻止从空队列读取数据,并等待数据出现在其中。在该boost类中,还支持定时等待,以及在队列已满时阻止写入程序。如果您需要在单个进程应用程序中使用这样的框架,boost::asio::io_服务应该足够了。下面是一个使用boost::thread和boost::asio::io_服务的工作盒示例类
#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;
}
#包括
#包括
#包括
I类工读作业
{
公众:
虚拟~IWorkerThreadJob(){};
虚空执行()=0;
};
类BoostBasedWorkingBox
{
公众:
BoostBasedWorkingBox():
m_IOService work(m_IOService),//给io_服务一些工作,否则它将从::run方法返回。
m_WorkerThread(boost::bind(&boost::asio::io_service::run,&m_IOService))
{}
~BoostBasedWorkingBox()
{
m_IOService.stop();
m_WorkerThread.join();
}
作废processJob(IWorkerThreadJob*pJob)
{
m_IOService.post(boost::bind(&IWorkerThreadJob::execute,pJob));
}
受保护的:
boost::线程m_WorkerThread;
boost::asio::io_服务m_IOService;
boost::asio::io_服务::work m_ioservice工作;
}
使用:-
实现IWorkerThreadJob接口。
从多个客户端调用processJob方法
这里boost::asio::io_服务充当线程安全队列。如果您在Windows上,您可以在ppl.h(VS2010新增)中使用并发_队列。如果您不在windows上,可以在英特尔的线程构建块中使用concurrent_queue.h
Anthony Williams还有一个基于条件变量的队列,这很好 仅供参考,消息队列要求数据可二进制序列化。因此,在过程中使用它并不是最方便的方法。只是添加更多信息,而不是反对答案