新闻中心
C++怎么实现一个线程安全的队列_C++使用互斥锁和条件变量构建并发队列
线程安全队列通过互斥锁保护共享数据、条件变量实现线程同步,确保生产者-消费者模型中多线程并发访问时的数据一致性与高效协作。

在C++多线程编程中,实现一个线程安全的队列是常见的需求。比如生产者-消费者模型就需要多个线程同时访问同一个队列,而不会引发数据竞争或状态不一致的问题。通过使用互斥锁(std::mutex)和条件变量(std::condition_variable),我们可以构建一个高效且安全的并发队列。
基本设计思路
线程安全队列的核心目标是:确保任意数量的生产者和消费者可以并发地入队和出队,而不会破坏内部数据结构或导致竞态条件。
关键点包括:
- 使用互斥锁保护对队列的读写操作,防止多个线程同时修改队列。
- 使用条件变量通知等待的线程——当队列为空时,消费者等待;当有新元素加入时,唤醒消费者。
- 避免忙等待,提高效率。
使用 std::queue + std::mutex + std::condition_variable 实现
下面是一个完整的线程安全队列实现示例:
#include <queue>
#include <mutex>
#include <condition_variable>
#include <thread>
template<typename T>
class ThreadSafeQueue {
private:
std::queue<T> data_queue;
mutable std::mutex mtx;
std::condition_variable cv;
public:
ThreadSafeQueue() = default;
void push(T value) {
std::lock_guard<std::mutex> lock(mtx);
data_queue.push(std::move(value));
cv.notify_one(); // 唤醒一个等待的消费者
}
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;
}
void wait_and_pop(T& value) {
std::unique_lock<std::mutex> lock(mtx);
cv.wait(lock, [this] { return !data_queue.empty(); });
value = std::move(data_queue.front());
data_queue.pop();
}
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();
}
};
各方法说明与使用建议
push(T value):将元素加入队列。加锁后插入,并调用 notify_one() 唤醒一个正在等待的消费者线程。
try_pop(T& value):非阻塞尝试弹出元素。如果队列为空返回 false,否则赋值并返回 true。适合不想阻塞的场景。
wait_and_pop(T& value):阻塞式出队。若队列为空,则等待直到有元素可用。内部使用 unique_lock 配合条件变量实现高效等待。
empty() 和 size():提供只读查询功能。注意这些值可能在调用后立即变化,仅作参考。
使用示例:生产者-消费者模型
以下是一个简单的多线程测试例子:
#include <iostream>
void producer(ThreadSafeQueue<int>& queue) {
for (int i = 0; i < 5; ++i) {
queue.push(i);
std::this_thread::sleep_for(std::chrono::milliseconds(100));
}
}
void consumer(ThreadSafeQueue<int>& queue) {
for (int i = 0; i < 5; ++i) {
int value;
queue.wait_and_pop(value);
std::cout << "Consumed: " << value << '\n';
}
}
int main() {
ThreadSafeQueue<int> queue;
std::thread p(producer, std::ref(queue));
std::thread c(consumer, std::ref(queue));
p.join();
c.join();
return 0;
}
这个例子中,生产者每100ms放入一个数,消费者同步取出并打印。由于使用了条件变量,消费者不会占用CPU空转,而是被唤醒后处理数据。
基本上就这些。只要正确使用互斥锁保护共享状态,配合条件变量实现线程间通信,就能
写出稳定高效的并发队列。实际项目中还可以扩展支持超时弹出(wait_for)、多消费者唤醒等特性。
以上就是C++怎么实现一个线程安全的队列_C++使用互斥锁和条件变量构建并发队列的详细内容,更多请关注其它相关文章!
# 弹出
# 晋州公司网站优化
# 哈尔滨网站建设工程
# 珠海seo优化方法
# seo编辑19楼
# 网站推广好的有哪些平台
# 济源短视频seo软件
# 徐州产品seo推广公司
# 医保局网站建设建议
# 嘉兴互联网推广与营销
# 低价网站建设的总结
# 怎么做
# 重写
# c++
# 多个
# 为空
# 有什么
# 是一个
# 数据结构
# 多线程
# 互斥
# 并发访问
# stream
# ios
# ai
# 线程安全队列
相关栏目:
【
科技资讯46185 】
【
网络学院92790 】
相关推荐:
蛙漫漫画官网在线入口 蛙漫全本漫画免费阅读平台
Selenium Python中处理点击后新窗口加载冻结问题的策略与实践
漫蛙漫画登录站点 漫蛙2正版漫画快速访问
c++中为什么推荐使用using替代typedef_c++现代化类型别名
126邮箱网页版官方入口 126邮箱账号在线登录平台
QQ邮箱官方登录入口_QQ邮箱网页版快捷使用平台
Golang如何使用bytes.Split分割字节切片_Golang bytes切片分割方法
Python多线程中正确使用sigwait处理SIGALRM信号
如何优雅地解决Livewire文件上传难题?SpatieLivewireFilepond让一切变得简单
Windows7怎么硬盘安装 Windows7提取ISO镜像到非系统盘并运行setup.exe实现硬盘直装【教程】
手机CPU怎么影响游戏体验_手机CPU对游戏性能的影响分析
Win11怎么安装Linux子系统 Win11 WSL2安装Ubuntu及环境配置指南
Composer的 "licenses" 命令如何帮助你遵守开源协议_检查项目依赖的许可证合规性
三星GalaxyZFold5怎样在相册制作折叠屏分镜_iPhone三星GalaxyZFold5相册制作折叠屏分镜【创意编辑】
163邮箱登录密码 163邮箱忘记密码找回
J*a递归快速排序中静态变量导致数据累积的陷阱与解决方案
“音游” × “怪文书” 题材的节奏冒险游戏 《晕晕电波症候群》确定于2026年4月发售!
抖音怎么赚钱_抖音创作者变现方法与途径指南
钉钉视频会议声音异常如何处理 钉钉会议音频修复技巧
Yandex免登录官网入口_俄罗斯Yandex搜索引擎直达链接
Django表单提交验证失败后保持字段值不刷新
2026春节假期票务安排_2026春节放假购票指南
sublime怎么格式化代码_sublime代码美化与一键排版插件配置
age动漫网站入口 age动漫官网直接访问入口
谷歌学术网站直达地址 谷歌学术搜索网页版一键进入
QQ邮箱登录首页官网地址2026 QQ邮箱官方网页入口
《刺客信条:影》PS5 Pro和Switch 2画面对比
消息称三星明年 2 月正式发布 HBM4,与 SK 海力士同台竞技
C++如何实现线程池_C++11手动实现一个简单的固定大小线程池
解决Bootstrap卡片顶部边距导致背景图下移的问题
深入理解Go语言中Map值与方法接收器的交互:为什么需要临时变量
J*a TimerTask中HashMap意外清空的深层原因与解决方案
Web Components中自定义开关组件状态同步的常见陷阱与解决方案
Python多版本共存与虚拟环境管理深度指南
Golang如何使用buffered channel提高性能_Golang buffered channel优化技巧
理解Python模块与全局变量的作用域管理
在J*a中如何开发简易电子商务商品管理系统_商品管理系统项目实战解析
Go语言HTML解析:利用Goquery精准获取指定元素内容
Descript怎样用AI剪辑自动去噪_Descript用AI剪辑自动去噪【自动降噪】
Python中高效访问嵌套字典与列表中的键值对
电脑IP地址怎么查 查看本机IP地址的几种方法
抖音创作助手登录入口_抖音创作辅助工具官网直达
AO3网页版最新入口合集 Archive of Our Own在线访问指南
Golang如何安装Swagger工具_GoSwagger文档生成环境
Basecamp怎样用留言钉固定重点_Basecamp用留言钉固定重点【重点标记】
学习通网页版官方登录 超星学习通电脑端入口指南
如何将HTML表格多行数据保存到Google Sheets
C++如何解决segmentation fault_C++段错误调试与原因分析
KFC套餐升级怎么获取优惠代码_KFC套餐升级活动与优惠代码获取方法
蛙漫画网页版全站入口 蛙漫热门作品免费浏览


2025-11-23
浏览次数:次
返回列表