使用 std::queue 来管理消息队列的单例模式实现多线程消息通知

news/2024/11/7 18:29:52/

直接上代码:

// MessageQueue.h
#ifndef MESSAGEQUEUE_H
#define MESSAGEQUEUE_H#include <string>
#include <optional>
#include <mutex>
#include <queue>
#include <condition_variable>class MessageQueue {
public:// 禁止拷贝构造和赋值操作MessageQueue(const MessageQueue&) = delete;MessageQueue& operator=(const MessageQueue&) = delete;// 提供一个静态方法来获取单例实例static MessageQueue& getInstance() {static MessageQueue instance;return instance;}void send(const std::string& msg);std::optional<std::string> receive(int timeout_seconds);private:// 私有构造函数MessageQueue();~MessageQueue();std::mutex mtx;std::condition_variable cv;std::queue<std::string> message_queue;
};#endif // MESSAGEQUEUE_H
// MessageQueue.cpp
#include "MessageQueue.h"MessageQueue::MessageQueue() {}MessageQueue::~MessageQueue() {}void MessageQueue::send(const std::string& msg) {std::lock_guard<std::mutex> lock(mtx);message_queue.push(msg);cv.notify_one();
}std::optional<std::string> MessageQueue::receive(int timeout_seconds) {std::unique_lock<std::mutex> lock(mtx);if (cv.wait_for(lock, std::chrono::seconds(timeout_seconds), [this] { return !message_queue.empty(); })) {if (!message_queue.empty()) {std::string msg = message_queue.front();message_queue.pop();return msg;}}return std::nullopt;
}

在 send 方法中,我们使用 std::lock_guard 来锁定互斥量,然后将消息推入队列,并设置 message_received 标志为 true,之后通知等待的线程。

在 receive 方法中,我们使用 std::unique_lock 和 std::condition_variable::wait_for 来等待直到有消息到来或者超时。如果队列不为空,我们从队列中取出并返回消息。

int main() {MessageQueue queue;// 假设这是另一个线程发送消息的代码// queue.send("Hello, World!");// 尝试接收消息,设置超时时间为5秒auto msg = queue.receive(5);if (msg) {std::cout << "Received message: " << *msg << std::endl;} else {std::cout << "No message received within 5 seconds, timeout occurred." << std::endl;}return 0;
}

在上面的代码中,receive函数接收一个timeout_seconds参数,表示超时时间(以秒为单位)。它使用cv.wait_for来等待,直到队列中有消息或者超时。如果wait_for返回true,表示等待被条件变量满足的条件唤醒,此时如果队列不为空,它会返回队列中的消息。如果wait_for返回false,则表示等待超时,此时receive函数返回std::nullopt,表示没有接收到消息。

main函数中,我们尝试接收消息,如果receive返回std::nullopt,我们打印一条超时消息。如果返回了一个有效的消息,我们打印接收到的消息。

这种处理方式确保了即使没有消息到达,程序也不会无限期地等待,并且能够优雅地处理超时情况。


http://www.ppmy.cn/news/1545132.html

相关文章

【Ai测评】GPT Search偷偷上线,向Google和微软发起挑战!

最近&#xff0c;OpenAI 又推出了一个令人兴奋的新功能——GPT Search&#xff0c;已经正式上线了&#xff01; 功能介绍 GPT Search&#xff1a;为你带来全新搜索体验 目前&#xff0c;桌面端和移动端应用程序已经全面上线&#xff0c;所有 GPT Plus 和 Team 用户都可以立即…

网络安全从入门到精通(特别篇II):应急响应之DDOS处置流程

应急响应之DDOS事件处置流程 1. 现场访谈 访谈管理员,了解DDOS事件情况。 了解当前异常情况,异常出现的时间以及相应时间段内的流量情况,尤其是否有明显流量增大的情况;同时造成何种影响,当前最迫切的需求;了解当前的网络架构以及网络设备情况,同时了解业务系统架构,…

Node.js简介以及安装部署 (基础介绍 一)

Node.js简介 Node.js是运行在服务端的JavaScript。 Node.js是一个基于Chrome JavaScript运行时建立的一个平台。 Node.js是一个事件驱动I/O服务端JavaScript环境&#xff0c;基于Google的V8引擎&#xff0c;V8引擎执行Javascript的速度非常快&#xff0c;性能非常好。 Node.…

交换机和集线器的区别

交换机&#xff08;Switch&#xff09;和集线器&#xff08;Hub&#xff09;都是用于在局域网&#xff08;LAN&#xff09;中连接多台计算机的网络设备&#xff0c;但它们的工作原理和功能有很大的不同。 1. 工作原理 集线器&#xff08;Hub&#xff09;&#xff1a; 集线器是…

Docker 配置镜像加速

docker 拉取代码时出现 ERROR: failed to solve: node:16: unexpected status from HEAD request to https:// xxxxxx.mirror.aliyuncs.com/v2/library/node/m…

【C++】详细介绍:priority_queue的使用、适配器、deque介绍、仿函数

目录 一、介绍 二、使用 三、函数模版和类模板的区别 四、适配器 1、适配器适配栈 扩展&#xff1a; 2、deque&#xff08;双端队列&#xff09; 缺省模版 五、仿函数 一、介绍 &#xff08;1&#xff09;、priority_queue称为优先级队列&#xff0c;是一种容器适配器&…

【软服之家-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 1. 暴力破解密码&#xff0c;造成用户信息泄露 2. 短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉 3. 带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造…

【PDF提取神器】针对LLM推出的PymuPDF4llm库 可提取pdf中的文字/表格/图像/单词

目录 前言 安装Pymupdf4llm 多模态具体应用 API 文档 前言 PymuPDF4llm 是最新推出的pdf提取工具&#xff0c;针对LLM进行了专门优化&#xff0c;它支持markdown提取和LlamaIndex文档输出&#xff0c;可以准确提取pdf中的结构化数据&#xff0c;包括文字/表格/图像/单词&a…