0

0

C++中的无锁队列(Lock-free Queue)是什么?(如何在高并发场景下实现)

冰火之心

冰火之心

发布时间:2026-02-24 17:15:58

|

374人浏览过

|

来源于php中文网

原创

无锁队列是基于原子操作和内存序实现的线程安全队列,避免锁开销但逻辑复杂、易出aba等问题;需用std::atomic管理指针、延迟回收节点、防伪共享,并优先选用成熟实现如moodycamel::concurrentqueue。

c++中的无锁队列(lock-free queue)是什么?(如何在高并发场景下实现)

无锁队列不是“没锁”,而是不依赖互斥量的线程安全队列

它靠原子操作(如 compare_exchange_weak)和内存序(memory_order)保障多生产者/多消费者下的正确性,避免了锁带来的阻塞、优先级反转和上下文切换开销。但代价是逻辑更复杂、调试困难、对硬件内存模型敏感。

常见错误现象:segmentation fault 在高并发下偶发出现;队列看似“吞”了元素却读不到;ABA 问题 导致指针被错误重用。

  • 必须用 std::atomic<t></t> 管理节点指针,不能只对数据域做原子操作
  • memory_order_relaxed 仅适用于计数器等无依赖场景;入队/出队关键路径至少需 memory_order_acquire / memory_order_release
  • 节点内存不能在出队后立刻 delete——其他线程可能还在读它的 next 指针,得用 Hazard Pointer 或 RCU 延迟回收

MPMC 场景下最实用的实现:基于 Michael-Scott 算法的变种

这是工业级无锁队列(如 Boost.Lockfree、Facebook Folly 的 ProducerConsumerQueue)的底层基础。它用两个原子指针 headtail,配合“懒删除”处理竞争。

使用场景:日志批量写入、网络包分发、事件循环任务投递——要求低延迟、高吞吐,且能容忍少量内存占用增长。

立即学习C++免费学习笔记(深入)”;

Paraflow
Paraflow

AI产品设计智能体

下载
  • 入队时先 CAS 更新 tail->next,再 CAS 移动 tail;失败则重试,不阻塞
  • 出队时类似,但需跳过已被标记为“已出队”的节点(通过将 next 最低位设为 1 实现标记)
  • 别直接抄教科书代码:x86 上 memory_order_acq_rel 可行,ARM/AArch64 必须显式补 memory_order_acquire + memory_order_release,否则可能乱序

std::queue + std::mutex 不是“慢”,而是成了扩展瓶颈

单核性能差距可能不到 2 倍,但 32 线程争抢同一把 std::mutex 时,90% 时间花在 futex 等待上。这不是锁写得不好,是设计范式冲突。

性能影响:锁队列的吞吐量在 8 核以上基本持平甚至下降;无锁队列在 64 核下仍近似线性增长,但前提是节点分配不碰全局堆(要用对象池或 std::pmr::polymorphic_allocator)。

  • 不要用 new 在入队时分配节点——内存分配器本身是锁保护的,瞬间退化成“伪无锁”
  • 如果业务允许固定大小,优先用环形缓冲(boost::lockfree::spsc_queue),它连原子操作都省了,只靠指针+内存屏障
  • 调试时加 assert 检查 head == tail 时是否真为空,很多 bug 来自对“空/满”边界的误判

别自己从零手撸,但得看懂开源实现在防什么

Linux 内核的 lockless list、Folly 的 AtomicUnorderedMap 底层、甚至 Rust 的 crossbeam-queue 都在反复验证同一批坑。自己实现前,先跑通 moodycamel::ConcurrentQueue 的 stress test。

容易被忽略的地方:缓存行伪共享(false sharing)。把 headtail 放同一个 cache line 里,两个 CPU 核疯狂 ping-pong 同一行,性能比有锁还差。

  • alignas(64) 强制分离热字段,或填充 char pad[64]
  • 所有指针操作必须配对检查:CAS 成功后立即读新值,不能假设“刚写完就一定可见”
  • 测试不能只跑 1 秒——无锁 bug 往往在 10 分钟连续压测后才触发,用 ThreadSanitizer + UndefinedBehaviorSanitizer 是底线

真正难的不是写对第一个版本,是让那个版本在不同编译器(GCC/Clang/MSVC)、不同优化等级(-O2 vs -O3)、不同 CPU 架构(x86-64/ARM64/RISC-V)下行为一致。这点没人能跳过。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全
C++系统编程内存管理_C++系统编程怎么与Rust竞争内存安全

C++系统编程中的内存管理是指 对程序运行时内存的申请、使用和释放进行精细控制的机制,涵盖了栈、堆、静态区等不同区域,开发者需要通过new/delete、智能指针或内存池等方式管理动态内存,以避免内存泄漏、野指针等问题,确保程序高效稳定运行。它核心在于开发者对低层内存有完全控制权,带来灵活性,但也伴随高责任,是C++性能优化的关键。

13

2025.12.22

Rust异步编程与Tokio运行时实战
Rust异步编程与Tokio运行时实战

本专题聚焦 Rust 语言的异步编程模型,深入讲解 async/await 机制与 Tokio 运行时的核心原理。内容包括异步任务调度、Future 执行模型、并发安全、网络 IO 编程以及高并发场景下的性能优化。通过实战示例,帮助开发者使用 Rust 构建高性能、低延迟的后端服务与网络应用。

6

2026.02.11

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

422

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

595

2023.08.10

线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

719

2023.08.10

数据库Delete用法
数据库Delete用法

数据库Delete用法:1、删除单条记录;2、删除多条记录;3、删除所有记录;4、删除特定条件的记录。更多关于数据库Delete的内容,大家可以访问下面的文章。

287

2023.11.13

drop和delete的区别
drop和delete的区别

drop和delete的区别:1、功能与用途;2、操作对象;3、可逆性;4、空间释放;5、执行速度与效率;6、与其他命令的交互;7、影响的持久性;8、语法和执行;9、触发器与约束;10、事务处理。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.12.29

页面置换算法
页面置换算法

页面置换算法是操作系统中用来决定在内存中哪些页面应该被换出以便为新的页面提供空间的算法。本专题为大家提供页面置换算法的相关文章,大家可以免费体验。

470

2023.08.14

Golang 生态工具与框架:扩展开发能力
Golang 生态工具与框架:扩展开发能力

《Golang 生态工具与框架》系统梳理 Go 语言在实际工程中的主流工具链与框架选型思路,涵盖 Web 框架、RPC 通信、依赖管理、测试工具、代码生成与项目结构设计等内容。通过真实项目场景解析不同工具的适用边界与组合方式,帮助开发者构建高效、可维护的 Go 工程体系,并提升团队协作与交付效率。

1

2026.02.24

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 10.1万人学习

C 教程
C 教程

共75课时 | 4.9万人学习

C++教程
C++教程

共115课时 | 19.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号