C++如何实现一个阻塞队列?C++生产者消费者模型实战【多线程】


用std::queue+mutex+condition_variable可实现线程安全阻塞队列:pop()用while循环等待非空并取数,push()加锁入队后notify_one;支持移动语义与生产者-消费者模型。

c++如何实现一个阻塞队列?c++生产者消费者模型实战【多线程】

std::queue + std::mutex + std::condition_variable 就能实现一个线程安全、真正阻塞的队列,核心是让取数据的线程在队列空时“等通知”,而不是轮询或报错。

阻塞队列的基本结构

它要支持两个关键操作:push()(生产者调用)和 pop()(消费者调用)。pop 必须阻塞直到有数据;push 一般不阻塞(也可加容量限制做成有界队列)。

需要封装以下成员:

  • 一个 std::queue 存数据
  • 一个 std::mutex 保护队列读写
  • 一个 std::condition_variable 用于通知“有新数据了”

实现 pop():空时自动等待

pop 要做三件事:加锁 → 检查是否为空 → 为空就 wait() → 有数据就取走并返回。

注意必须用 while 循环检查条件(不是 if),防止虚假唤醒:

void pop(T& item) {
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [this] { return !q.empty(); }); // 等待非空
    item = std::move(q.front());
    q.pop();
}

实现 push():插入后发通知

push 只需加锁、入队、解锁,然后调用 cv.notify_one()(或 notify_all)告诉至少一个等待的消费者可以取了:

FaceSwapper FaceSwapper

FaceSwapper是一款AI在线换脸工具,可以让用户在照片和视频中无缝交换面孔。

FaceSwapper 960 查看详情 FaceSwapper
void push(const T& item) {
    std::lock_guard<std::mutex> lock(mtx);
    q.push(item);
    cv.notify_one(); // 唤醒一个等待 pop 的线程
}

如果希望支持移动语义,push 重载一个右值引用版本会更高效。

生产者消费者实战小例子

开两个线程:一个每秒 push 一个数字;另一个不停 pop 并打印。主函数用 join() 等待结束:

BlockingQueue<int> bq;
std::thread t1([&]{ for (int i = 0; i < 5; ++i) { bq.push(i); std::this_thread::sleep_for(1s); } });
std::thread t2([&]{ int x; for (int i = 0; i < 5; ++i) { bq.pop(x); std::cout << "got " << x << '\n'; } });

t1.join(); t2.join();

输出顺序可能交错,但不会漏数、不会崩溃——这就是阻塞队列+条件变量的威力。

基本上就这些。不复杂但容易忽略 while 条件检查和 notify 的时机,写对了就能稳稳跑多线程。

以上就是C++如何实现一个阻塞队列?C++生产者消费者模型实战【多线程】的详细内容,更多请关注其它相关文章!


# 多路  # 珠海网站建设规划书模板  # 无锡软文营销推广制作  # 网站建设方案的定位  # 广汉物流网站建设  # 网站建设之初的定位  # 佛山买衣服网站免费推广  # app有seo吗  # 吾爱破解SEO工具  # 啥是令牌推广网站啊视频  # 流量交换联盟网站推广法  # 复用  # go  # 管理机制  # 为空  # 何为  # 加锁  # 就能  # 都是  # 如何实现  # 多线程  # c++  # ai 


相关栏目: 【 Google疑问12 】 【 Facebook疑问10 】 【 优化推广96088 】 【 技术知识133117 】 【 IDC资讯59369 】 【 网络运营7196 】 【 IT资讯61894


相关推荐: mysql触发器如何编写_mysql触发器编写规范与代码示例讲解  在PHP环境中正确加载HTML资源:CSS样式与图片路径指南  我的世界游戏平台入口 我的世界官方官网直达链接  鼠标没反应了怎么办 无线/有线鼠标失灵的解决方法【详解】  《下一站江湖2》独孤剑诀习得方法  《杖剑传说》食谱大全  视频转蓝光m2ts格式  Scipy Sparse CSR 矩阵非零元素行级遍历的最佳实践  海棠阅读登录教程_详细讲解海棠登录操作  MySQL多重JOIN技巧:高效关联同一表获取多角色信息  51漫画网实时入口 51漫画网页版官方免费漫画入口  微信如何设置字体大小_微信字体设置的阅读舒适  J*aScript中高效处理用户输入:从Keyup事件到表单提交的优化实践  《伊瑟》凶影追缉库卢鲁boss攻略  《雷电模拟器》自动点击设置方法  todesk如何添加信任设备_todesk信任设备设置教程  如何快速去除厨房重油污? 2025年最好用的厨房清洁剂推荐  win11如何开启单声道音频 Win11为听障用户合并左右声道【辅助】  J*aScript桌面应用_Electron多进程架构实战  使用Selenium在无头Chrome中交互动态菜单和复选框的策略  oppo手机如何通过下拉通知栏截图_oppo手机通知栏快捷截图方法  秋风萧瑟洪波涌起中的萧瑟指的是什么  rabbitmq 持久化有什么缺点?  composer 提示 "requires ext-soap" 缺少 SOAP 扩展怎么办?  CSS如何在页面中引入重置样式_使用Normalize.css或Reset.css统一浏览器默认样式  微信网页版在线登录 微信网页版在线使用入口  漫蛙app官方版手机正版入口-漫蛙漫画manwa在线漫画正版入口  悟空浏览器网页版在线工具 悟空浏览器网页版在线平台入口  《糖豆》添加舞曲方法  招商淘客入门指南  《via浏览器》强制缩放网页设置方法  Win11如何分屏操作_Win11多窗口分屏技巧  谷歌学术论文搜索引擎 谷歌学术官网入口论坛永久链接  J*a列表元素格式化输出教程  曝《丝之歌》DLC有望开发!开发商还有神秘新企划  《金山词霸》语音翻译方法  抖音号显示企业机构号是什么意思?企业机构号申请条件是什么?  VS Code的时间线(Timeline)视图:您的代码时光机  狙击外星人小游戏在线链接_狙击外星人小游戏网页链接  《下一站江湖2》风神腿获取攻略  composer licenses 命令:如何检查项目依赖的许可证?  冬季去哪个城市旅游更有可能观测到极光  《KARDS》冬季扩展包“国土阵线”上线!全新“协力”机制改变战场格局  b站怎么设置动态仅粉丝可见_b站动态粉丝可见设置方法  win11如何诊断DirectX问题 Win11运行dxdiag工具排查显卡故障【排错】  Python csv 模块处理非字符串数据:列表写入 CSV 文件的机制解析  c++如何实现观察者设计模式_c++行为型设计模式实战  如何在CSS中使用伪类:valid实现表单验证提示_结合:valid改变边框颜色  Golang如何操作指针参数_Go pointer参数传递规则  如何在 WordPress 前端实现内容提交:古腾堡编辑器的替代方案与实践 

 2025-12-19

了解您产品搜索量及市场趋势,制定营销计划

同行竞争及网站分析保障您的广告效果

点击免费数据支持

提交您的需求,1小时内享受我们的专业解答。

运城市盐湖区信雨科技有限公司


运城市盐湖区信雨科技有限公司

运城市盐湖区信雨科技有限公司是一家深耕海外推广领域十年的专业服务商,作为谷歌推广与Facebook广告全球合作伙伴,聚焦外贸企业出海痛点,以数字化营销为核心,提供一站式海外营销解决方案。公司凭借十年行业沉淀与平台官方资源加持,打破传统外贸获客壁垒,助力企业高效开拓全球市场,成为中小企业出海的可靠合作伙伴。

 8156699

 13765294890

 8156699@qq.com

Notice

We and selected third parties use cookies or similar technologies for technical purposes and, with your consent, for other purposes as specified in the cookie policy.
You can consent to the use of such technologies by closing this notice, by interacting with any link or button outside of this notice or by continuing to browse otherwise.