C++消息队列的基本实现

        在C++中,并没有直接提供消息队列(Message Queue)的标准库实现。但是,你可以使用std::queuestd::mutex(或std::lock_guard)、std::condition_variable等工具自己实现一个简单的线程安全消息队列。以下是一个简单的示例:

#include <queue>  
#include <mutex>  
#include <condition_variable>  
#include <stdexcept>  template <typename T>  
class MessageQueue {  
public:  MessageQueue() = default;  ~MessageQueue() = default;  // 禁止拷贝构造和拷贝赋值  MessageQueue(const MessageQueue&) = delete;  MessageQueue& operator=(const MessageQueue&) = delete;  // 移动构造和移动赋值  MessageQueue(MessageQueue&& other) noexcept : _queue(std::move(other._queue)),   _mutex(std::move(other._mutex)),  _cv(std::move(other._cv)) {  other._cv = std::condition_variable();  // 重置条件变量  }  MessageQueue& operator=(MessageQueue&& other) noexcept {  if (this != &other) {  _queue = std::move(other._queue);  _mutex = std::move(other._mutex);  _cv = std::move(other._cv);  other._cv = std::condition_variable();  // 重置条件变量  }  return *this;  }  void push(T new_value) {  std::lock_guard<std::mutex> lock(_mutex);  _queue.push(std::move(new_value));  _cv.notify_one();  // 通知等待的线程  }  T pop() {  std::unique_lock<std::mutex> lock(_mutex);  _cv.wait(lock, [this]{ return !_queue.empty(); });  // 等待队列非空  T popped_value = std::move(_queue.front());  _queue.pop();  return popped_value;  }  bool try_pop(T& value) {  std::lock_guard<std::mutex> lock(_mutex);  if (_queue.empty()) {  return false;  }  value = std::move(_queue.front());  queue_.pop();  return true;  }  //轮询消息bool poll(T& msg) {std::unique_lock<std::mutex> lock(_mutex);if (_queue.size()){msg = _queue.front();_queue.pop();return true;}return false;}//等待消息void wait(T& msg) {std::unique_lock<std::mutex> lock(_mutex);while (!_queue.size()) _cv.wait(lock);msg = _queue.front();_queue.pop();}//队列长度size_t size() {std::unique_lock<std::mutex> lock(_mutex);return _queue.size();}bool empty() const {  std::lock_guard<std::mutex> lock(_mutex);  return _queue.empty();  }  private:  std::queue<T> _queue;  mutable std::mutex _mutex;  std::condition_variable _cv;  
};

这个MessageQueue类模板提供了一个线程安全的消息队列。它使用std::queue来存储消息,使用std::mutex来同步访问,并使用std::condition_variable来在队列为空时阻塞pop操作,以及在有新消息时通知等待的线程。

这个实现允许你在多线程环境中安全地推送和弹出消息。请注意,push操作是非阻塞的,而pop操作会阻塞直到队列中有消息。此外,还提供了一个try_pop方法,该方法尝试从队列中弹出消息,如果队列为空,则返回false

需要注意的是,这个实现是基本的,并且可能不适合所有用例。例如,它并没有处理生产者或消费者过多的情况,这可能导致队列的大小无限增长。在实际应用中,你可能需要添加一些额外的逻辑来处理这种情况,例如限制队列的大小,或者在队列满时阻塞生产者。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/789974.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vulnhub靶机: DC-9

dc-9靶机下载 将靶机设置为NAT模式&#xff0c;本次实验使用的内网网段为192.168.198.0/24&#xff0c;kali的ip为192.168.198.172 信息搜集 ip主机扫描&#xff1a; nmap -sP 192.168.198.0/24 确定靶机ip为192.168.198.171 主机端口扫描&#xff1a; nmap -T4 -A -v 192…

python基础——模块【模块的介绍,模块的导入,自定义模块,*和__all__,__name__和__main__】

&#x1f4dd;前言&#xff1a; 这篇文章主要讲解一下python基础中的关于模块的导入&#xff1a; 1&#xff0c;模块的介绍 2&#xff0c;模块的导入方式 3&#xff0c;自定义模块 &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C语言入门基…

嵌入式开发中,通过终端控制芯片GPIO电平

echo 204 > /sys/class/gpio/export 这个命令是在 Linux 系统中用于向 GPIO&#xff08;通用输入输出&#xff09;子系统注册一个 GPIO 引脚。GPIO 是一种用于与外部设备通信的通用硬件接口&#xff0c;可以通过读写 GPIO 引脚的状态来与外部设备进行通信&#xff0c;如传感…

大数据面试专题 -- kafka

1、什么是消息队列&#xff1f; 是一个用于存放数据的组件&#xff0c;用于系统之间或者是模块之间的消息传递。 2、消息队列的应用场景&#xff1f; 主要是用于模块之间的解耦合、异步处理、日志处理、流量削峰 3、什么是kafka&#xff1f; kafka是一种基于订阅发布模式的…

通过SSH在苹果手机上查看系统文件:远程访问iOS文件系统的方法

​ 目录 引言 用户登录工具和连接设备 查看设备信息&#xff0c;电池信息 查看硬盘信息 硬件信息 查看 基带信息 销售信息 电脑可对手机应用程序批量操作 运行APP和查看APP日志 IPA包安装测试 注意事项 引言 苹果手机与安卓手机不同&#xff0c;无法直接访问系统文件…

python基于django协同算法的个性化音乐推荐系统的设计与实现

本个性化音乐推荐系统以Django作为框架&#xff0c;b/s模式以及MySql作为后台运行的数据库。本系统主要包括以下功能模块&#xff1a;首页&#xff0c;个人中心&#xff0c;用户管理&#xff0c;歌曲类型管理&#xff0c;明星歌手管理&#xff0c;歌曲音乐管理&#xff0c;歌曲…

权限提升技术:攻防实战与技巧

本次活动赠书1本&#xff0c;包邮到家。参与方式&#xff1a;点赞收藏文章即可。获奖者将以私信方式告知。 网络安全已经成为当今社会非常重要的话题&#xff0c;尤其是近几年来&#xff0c;我们目睹了越来越多的网络攻击事件&#xff0c;例如公民个人信息泄露&#xff0c;企业…

【Jenkins】关于账号,证书验证的设置问题

当你的电脑启动了Jenkins&#xff0c;这时候一定要小心更改管理员账号和密码~~~ 当你的电脑启动了Jenkins&#xff0c;这时候一定要小心更改管理员账号和密码~~~ 当你的电脑启动了Jenkins&#xff0c;这时候一定要小心更改管理员账号和密码~~~ 重要的事情说3遍&#xff0c;如…

阿里云数据库服务器价格表查询_一张表精准报价

阿里云数据库服务器价格表&#xff0c;优惠99元一年起&#xff0c;ECS云服务器2核2G、3M固定带宽、40G ESSD Entry云盘&#xff0c;优惠价格99元一年&#xff1b;阿里云数据库MySQL版2核2G基础系列经济版99元1年、2核4GB 227.99元1年&#xff0c;云数据库PostgreSQL、SQL Serve…

财经界投稿发表论文知网收录

《财经界》是由国家新闻出版总署批准、国家发展计划委员会主管、国家信息中心主办的正规国家级经济类期刊。本刊为大型财经刊物&#xff0c;旨在介绍国家宏观经济政策、经济环境、经济信息和分析经济热点问题。杂志面向各级政府决策层、财经高管人员、研究机构的专家学者、资本…

ES学习日记(九)-------logstash导入数据

一、安装和下载 es官网下载地址 官方介绍:Logstash是开源的服务器端数据处理管道&#xff0c;能够同时从多个来源采集数据&#xff0c;转换数据&#xff0c;然后将数据发送到您最喜欢的“存储库”中。(我们的存储库当然是 Elasticsearch。) 下载和ES一样的版本(很重要,必须这…

轻量应用服务器16核32G28M腾讯云租用优惠价格4224元15个月

腾讯云16核32G服务器租用价格4224元15个月&#xff0c;买一年送3个月&#xff0c;配置为&#xff1a;轻量16核32G28M、380GB SSD盘、6000GB月流量、28M带宽&#xff0c;腾讯云优惠活动 yunfuwuqiba.com/go/txy 活动链接打开如下图&#xff1a; 腾讯云16核32G服务器租用价格 腾讯…

Acwing.1388 游戏(区间DP对抗思想)

题目 玩家一和玩家二共同玩一个小游戏。 给定一个包含 N个正整数的序列。 由玩家一开始&#xff0c;双方交替行动。 每次行动可以在数列的两端之中任选一个数字将其取走&#xff0c;并给自己增加相应数字的分数。&#xff08;双初始分都是 0分&#xff09; 当所有数字都被…

VPN——GRE

1、VPN概念 Virtual Private Network ①虚拟专用网络 ②在公有的网络上架设私有的通道&#xff0c;构建一个专用的、安全性、服务质量得到保障的网络 ③实质&#xff1a;数据包的再封装与解封装的过程 2、分类 按照业务用途&#xff1a;【1】access&#xff1a;外出员工…

rust 自定义安装 error: linker `link.exe` not found

解决方案 On VS 2022, I tested both solutions. 4.39 GB “MSVC v143 - VS 2022 C x64/x86 build tools” and “Windows 10 SDK” 2.86 GB “Desktop development with C” Its better to just select “Desktop Development with C”. Heres the download for VS 202…

FIT-RAG:RAG架构是否正在趋向于标准化方法?

原文地址&#xff1a;fit-rag-are-rag-architectures-settling-on-a-standardised-approach 2024 年 4 月 2 日 随着RAG的使用&#xff0c;漏洞开始显现&#xff0c;这些问题的解决方案也开始变得越来越相似。 介绍 随着技术的不断发展&#xff0c;我们注意到一个有趣的现象&am…

rasa trian 报错解决---Project validation completed with errors.

rasa train 过程中&#xff1a;出现一下问题&#xff1b; Project validation completed with errors. 解决措施:python 3.10版本&#xff0c;rasa 3.6.19, 降低版本 pip3 install rasa3.5.17 -i https://pypi.tuna.tsinghua.edu.cn/simple成功解决

CS架构---Socket基础

目录 一、Socket简介1.1 通信模型1.2 类型1.3 创建和使用&#xff1a;1.4 地址族 二、客户/服务器模式2.1 服务器端&#xff08;Server Side&#xff09;2.2 客户端&#xff08;Client Side&#xff09;2.3 通信方式2.4 角色分工2.5 优点 三、Socket实战四、常见应用场景 一、S…

7个影响AEC的AI工具

人工智能&#xff08;AI&#xff09;工具在各个行业中越来越受欢迎&#xff0c;ChatGDP的推出无疑让人们看到了人工智能所能提供的可能性。 然而&#xff0c;人工智能不仅仅是生成文本或图形——它可以用于各种设置。 建筑行业也不例外&#xff0c;我们才刚刚开始发现人工智能…

探索----------------阿里云

目录 一、阿里云四大件 1、云服务器ECS 2、云数据库RDS 3、负载均衡SLB 4、对象存储OSS 5、其他的云计算产品 1&#xff09;内容分发网络CDN 2&#xff09;专有网络 VPC 二、linux发行版本 三、你平时对系统会怎么优化&#xff08;五大负载&#xff09; 1、cpu 使用率…