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

Posted

技术标签:

【中文标题】我可以使用 boost::threadpool 作为“线程安全队列”吗?【英文标题】:Can i use boost::threadpool as a 'thread-safe queue'? 【发布时间】:2011-01-01 23:35:09 【问题描述】:

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

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

我现在考虑使用 Boost::threadpool 来执行此操作。只需将并行线程数设置为 1,每次有新消息从客户端到达时,任务函数的输入参数都会更改。这有意义吗,这里有什么我没有预料到的限制吗?

【问题讨论】:

【参考方案1】:

在 boost 中有一个message queue class,这就是你需要的:一个线程安全的队列。

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

【讨论】:

仅供参考,消息队列要求数据可以二进制序列化ref。所以在流程中使用它并不是最方便的方式。 只是添加更多信息,而不是反对答案【参考方案2】:

如果在单进程应用中需要这样的框架,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 充当线程安全队列。

【讨论】:

【参考方案3】:

如果您在 Windows 上,您可以在 ppl.h 中使用 concurrent_queue(VS2010 的新功能)。如果您不在 Windows 上,您可以在 Intel 的线程构建块中使用 concurrent_queue.h。

Anthony Williams 也有一个基于条件变量 on his blog 的队列,这很好。

【讨论】:

以上是关于我可以使用 boost::threadpool 作为“线程安全队列”吗?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 printf() 可以在内核中工作,但使用 std::cout 不能?

为啥 printf() 可以在内核中工作,但使用 std::cout 不能?

有没有我可以使用的 js 函数来使占位符属性在 IE 中工作? [复制]

reCAPTCHA 是不是可以在没有域名的 html 中工作?

是否可以使用 NAT 网络让 FTP 在 VirtualBox 中工作或让 php 的 ftp 功能工作

无法让 @Secured 在 Spring MVC 中工作