答案:C++线程安全队列通过mutex保护共享数据,结合condition_variable实现阻塞与超时机制,确保多线程环境下队列操作的安全性与效率。

在C++中实现一个线程安全的队列,核心是保护共享数据不被多个线程同时访问导致竞争。最常用的方法是结合标准库中的 std::queue、std::mutex 和 std::lock_guard(或更灵活的 std::unique_lock),必要时使用 std::condition_variable 实现阻塞操作。
适用于生产者-消费者模型中,不需要等待队列非空或非满的情况。
#include <queue>
#include <mutex>
template<typename T>
class ThreadSafeQueue {
private:
std::queue<T> data_queue;
mutable std::mutex mtx; // mutable 允许在 const 函数中加锁
public:
ThreadSafeQueue() = default;
void push(T value) {
std::lock_guard<std::mutex> lock(mtx);
data_queue.push(std::move(value));
}
bool try_pop(T& value) {
std::lock_guard<std::mutex> lock(mtx);
if (data_queue.empty()) {
return false;
}
value = std::move(data_queue.front());
data_queue.pop();
return true;
}
bool empty() const {
std::lock_guard<std::mutex> lock(mtx);
return data_queue.empty();
}
size_t size() const {
std::lock_guard<std::mutex> lock(mtx);
return data_queue.size();
}
};
当队列为空时,消费者线程自动等待新元素加入,适合大多数并发场景。
#include <queue>
#include <mutex>
#include <condition_variable>
template<typename T>
class BlockingQueue {
private:
std::queue<T> data_queue;
mutable std::mutex mtx;
std::condition_variable cv;
public:
void push(T value) {
std::lock_guard<std::mutex> lock(mtx);
data_queue.push(std::move(value));
cv.notify_one(); // 通知一个等待的消费者
}
T pop() {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this] { return !data_queue.empty(); });
T value = std::move(data_queue.front());
data_queue.pop();
return value;
}
bool try_pop(T& value) {
std::lock_guard<std::mutex> lock(mtx);
if (data_queue.empty()) return false;
value = std::move(data_queue.front());
data_queue.pop();
return true;
}
bool empty() const {
std::lock_guard<std::mutex> lock(mtx);
return data_queue.empty();
}
};
避免无限等待,增强程序健壮性。
bee餐饮点餐外卖小程序是针对餐饮行业推出的一套完整的餐饮解决方案,实现了用户在线点餐下单、外卖、叫号排队、支付、配送等功能,完美的使餐饮行业更高效便捷!功能演示:1、桌号管理登录后台,左侧菜单 “桌号管理”,添加并管理你的桌号信息,添加以后在列表你将可以看到 ID 和 密钥,这两个数据用来生成桌子的二维码2、生成桌子二维码例如上面的ID为 308,密钥为 d3PiIY,那么现在去左侧菜单微信设置
1
立即学习“C++免费学习笔记(深入)”;
使用 cv.wait_for 或 cv.wait_until 实现带超时的 pop 操作。
bool timed_pop(T& value, int milliseconds) {
std::unique_lock<std::mutex> lock(mtx);
if (cv.wait_for(lock, std::chrono::milliseconds(milliseconds),
[this] { return !data_queue.empty(); })) {
value = std::move(data_queue.front());
data_queue.pop();
return true;
}
return false; // 超时或队列仍为空
}
实现线程安全队列时需注意以下几点:
以上就是c++++如何实现一个线程安全的队列 _c++线程安全队列实现方法的详细内容,更多请关注php中文网其它相关文章!
c++怎么学习?c++怎么入门?c++在哪学?c++怎么学才快?不用担心,这里为大家提供了c++速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号