C++ 我可以将boost::threadpool用作';线程安全队列';?

C++ 我可以将boost::threadpool用作';线程安全队列';?,c++,multithreading,boost,message-queue,threadpool,C++,Multithreading,Boost,Message Queue,Threadpool,我需要的实际上是一个线程安全的队列结构,其中多个客户端不断将数据转储到队列中,一个工作线程不断处理和弹出队列 STL或Boost中是否存在任何成熟的解决方案 我现在考虑使用Boost::threadpool来实现这一点。只需将并行线程数设置为1,每次从客户端收到新消息时,任务函数的输入参数都会更改。这有意义吗?这里有我还没有预料到的限制吗?在boost中有一个,这就是您需要的:线程安全队列 消息队列是进程间通信中广泛使用的概念。消息队列是线程安全队列,其关键特性是它阻止从空队列读取数据,并等待数

我需要的实际上是一个线程安全的队列结构,其中多个客户端不断将数据转储到队列中,一个工作线程不断处理和弹出队列

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还有一个基于条件变量的队列,这很好

仅供参考,消息队列要求数据可二进制序列化。因此,在过程中使用它并不是最方便的方法。只是添加更多信息,而不是反对答案