直接上代码:
// 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
,我们打印一条超时消息。如果返回了一个有效的消息,我们打印接收到的消息。
这种处理方式确保了即使没有消息到达,程序也不会无限期地等待,并且能够优雅地处理超时情况。