我可以使用boost :: threadpool作为'线程安全队列'吗?

Jam*_*ond 9 c++ multithreading boost message-queue threadpool

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

STL或Boost中是否存在完善的解决方案?

我现在考虑使用Boost :: threadpool来做到这一点.只需将并行线程数设置为1,每当新消息从客户端到达时,任务函数的输入参数都会更改.这是否有意义,是否有任何我尚未在此预期的限制?

P S*_*ved 12

在boost中有一个消息队列类,这就是你需要的:一个线程安全的队列.

消息队列是进程间通信的一种广泛使用的概念.消息队列是线程安全队列,其关键特性是它在从空队列读取时阻塞并等待数据出现在其中.在该boost类中,还支持定时等待,以及在队列已满时阻止编写器.

  • 仅供参考,消息队列要求数据是二进制可序列化的[参考](http://www.boost.org/doc/libs/1_38_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.message_queue).因此在过程中使用它并不是最方便的方法._just添加更多信息,而不是答案_ (3认同)

Can*_*pus 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;


}
Run Code Online (Sandbox Code Playgroud)

使用: - 实现IWorkerThreadJob接口.从多个客户端调用processJob方法.

这里boost :: asio :: io_service充当线程安全队列.