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

     2023-03-10     228

关键词:

【中文标题】我可以使用 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 的队列,这很好。

【讨论】:

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

】为啥printf()可以在内核中工作,但使用std::cout不能?【英文标题】:Whydoesprintf()workwithinakernel,butusingstd::coutdoesn\'t?为什么printf()可以在内核中工作,但使用std::cout不能?【发布时间】:2021-02-0117:20:08【问题描述】:我一直在探索... 查看详情

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

】为啥printf()可以在内核中工作,但使用std::cout不能?【英文标题】:Whydoesprintf()workwithinakernel,butusingstd::coutdoesn\'t?为什么printf()可以在内核中工作,但使用std::cout不能?【发布时间】:2021-02-0117:20:08【问题描述】:我一直在探索... 查看详情

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

】有没有我可以使用的js函数来使占位符属性在IE中工作?[复制]【英文标题】:IsthereajsfunctionIcouldusethatwouldmaketheplaceholderattributeworkinIE?[duplicate]【发布时间】:2013-07-2708:17:42【问题描述】:现在我的项目中有一堆使用占位符的输... 查看详情

无法让 @Secured 在 Spring MVC 中工作

...ication启用了身份验证,并且使用&lt;security:http&gt;我可以控制哪些角色可以访问url。现在我想使用@S 查看详情

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

】是否可以使用NAT网络让FTP在VirtualBox中工作或让php的ftp功能工作【英文标题】:IsitpossibletogetFTPtoworkinVirtualBoxusingNATnetworkingorgetphp\'sftpfunctionstowork【发布时间】:2015-03-1510:04:06【问题描述】:我正在尝试让php的ftp方法在VM中工作... 查看详情

GLEW 无法在 Visual Studios 2010 中工作

...Init()运行我的多项目解决方案时,它会关闭。该项目虽然可以自行构建。当我注释掉这一行时,解决方案就可以运行了。我正在编写一个项目,该项目是VisualStudios2010中大型解决方案的一部分。该项目使用名为co 查看详情

尝试使用 C++ 使纹理在 OpenGL 中工作时访问冲突

...了解基本的代码结构等。现在,我只是想掌握C++概念。我可以使用我在网上找到的教程制作一个 查看详情

AWS Cognito 工作流程:使用电子邮件别名作为主用户名

...试图了解AWSCognito,但我遇到了一些问题。所以,现在我可以注册一个帐户,验证并登录。很简单。边缘案例就是我的墙所在的地方。这是我目前掌握的信息:username创建后无法更改我使用UU 查看详情

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

】reCAPTCHA是不是可以在没有域名的html中工作?【英文标题】:DoesreCAPTCHAworkinhtmlwithoutdomainname?reCAPTCHA是否可以在没有域名的html中工作?【发布时间】:2020-08-0900:46:24【问题描述】:我正在使用html开发一个网站,我想进行人工验... 查看详情

EL 空运算符如何在 JSF 中工作?

...SF?【发布时间】:2012-12-2012:54:26【问题描述】:在JSF中,可以使用EL空操作符来渲染或不渲染组件rendered="#notemptymyBean.myList"据我了解,该运算符既可以作为空检查,也可以检查列表是否为空。我想对我自己的自定义类的一些对象... 查看详情

Python脚本会使用pyspark在spark中工作吗

...python脚本,现在我想在spark的pysparkshell中执行该脚本。我可以马上做吗?【问题讨论】:【参考方案1】:要使用Spark的内存分布式处理能力,您需要使用pysparkAPI来定义S 查看详情

如何使用反应测试库模拟 ResizeObserver 以在单元测试中工作

...ary【发布时间】:2021-02-0922:42:04【问题描述】:如果有人可以提供帮助,我有一个自定义钩子,它使用ResizeObserver来更改组件的宽度。我的问题是,当我去运行我的单元测试时,它会破坏我的所有测试并查看快照, 查看详情

如何使编码未知的字节序列可用作 PHP 的输入?

...1-03-0917:03:36【问题描述】:我有一个编码未知的文件。我可以使用file_get_contents()将此文件作为字符串读取。我想导出这个字符串,以便它可以作为PHP代码使用。字符串可以使用bin2hex()以十六进 查看详情

toggleClass 可以在 Safari 中工作吗? (jQuery)

】toggleClass可以在Safari中工作吗?(jQuery)【英文标题】:CantoggleClassWorkinSafari?(JQuery)【发布时间】:2018-11-3003:21:16【问题描述】:对于使用.toggleClass()切换元素可见性的脚本所面临的问题,我尚未找到解决方案。下面的示例目前在F... 查看详情

Cache 是不是在 API 路由中工作,我们应该使用它吗?

...访问数据库,不如调用一次,多次使用。调用一次后,我可以将其存储在服 查看详情

如何使用外部 api 在 Laravel 应用程序中工作?

...发布请求将一些数据写入我的数据库。有哪些工具/脚本可以解决这个问题以及如何确保这些请求安全?修改:感谢您的反馈,但看起 查看详情

设置屏幕共享窗口的边界不再在 Lion 中工作

...持屏幕共享打开,但屏幕右上角的尺寸会缩小,这样我就可以有效地拥有“PIP”。当我想标记正在播放的歌曲或更改电影时,我使用键盘命令使窗口全尺寸,然后使用另一个键 查看详情

让 AJAX 在 PhoneGap 中工作

...本来从我拥有的数据库中检索数据。使用硬代码运行脚本可以正确检索数据,但它显示为ajax调用没有返回任何内容,或者甚至没有将数据作为post获取。目前在控制台中我收到"Originnullisnotal 查看详情