linux C++无锁RingBuffer实现
C++ 无锁环形缓冲区实现详解引言本文详细展示了一个完整的C++ 无锁环形缓冲区实现,包含日志模块、环形缓冲区核心实现以及测试程序。该实现支持单生产者单消费者(SPSC)和多生产者单消费者(MPSC)两种模式,并提供了阻塞式(满时等待)和覆盖式(满时覆盖旧数据)两种缓冲区策略。项目结构log_print.hpp/log_print.cpp:多线程安全的日志打印模块ringbuff.hpp:无锁环形缓冲区核心实现main.cpp:测试程序,验证各种缓冲区模式的功能和正确性核心特性无锁设计: 使用原子操作和内存序保证线程安全高性能: 避免锁竞争,提高并发性能灵活配置: 支持SPSC和MPSC模式,支持阻塞和覆盖策略线程安全日志: 内置日志模块便于调试多线程环境以下是完整的实现代码:log_print.hpp#includeiostream// 日志打印模块头文件// 提供多线程安全的日志打印功能,支持不同日志级别(INFO/WARNING/ERROR)// 自动捕获文件名、行号和线程ID,便于调试多线程环境#includesstream#includethread#includestring#includesys/syscall.h#includeunistd.henumLogLevel{INFO,WARNING,ERROR};// 多线程日志安全打印类classLogPrint{public:LogPrint(std::string fileName,intlineNumber,LogLevel logLevel);~LogPrint();// 重载 运算符,支持链式调用,接收cout一样的参数LogPrintoperator(constautomessage){ssmessage;return*this;}private:std::stringstream ss;};// 文件名和行号,只显示文件名,不显示路径#defineLOG_PRINT(logLevel)LogPrint(std::string(__FILE__).substr(std::string(__FILE__).find_last_of('/')+1),__LINE__,logLevel)log_print.cpp#includeiostream// 日志打印模块实现文件// 实现LogPrint类的构造函数和析构函数// 构造函数根据日志级别设置前缀颜色,析构函数输出完整的日志信息#includestring#includesstream#includesys/syscall.h#includeunistd.h#include"log_print.hpp"LogPrint::LogPrint(std::string fileName,intlineNumber,LogLevel logLevel){switch(logLevel){caseINFO:ss"[INFO] ";// 显示绿色信息,设置颜色为绿色break;caseWARNING:ss"[WARNING] ";// 显示黄色警告break;caseERROR:ss"[ERROR] ";// 显示红色错误break;}// 线程显示tid,方便调试多线程环境ssfileName":"lineNumber" "syscall(SYS_gettid)" : ";}LogPrint::~LogPrint(){std::coutss.str()std::endl;};ringbuff.hpp/* 实现一个单生产者单消费者无锁环形缓冲区 */#includeiostream#includethread#includeatomic#includevector#includestring#includeutility// For std::move#includethread// For std::this_thread::yield#includecstddef// For size_t#include"log_print.hpp"// For LOG_PRINTclassItem{public:// "sink" 参数:按值传递,调用方可以选择拷贝或移动Item(size_t c,std::string v):count(c),value(std::move(v)){}Item():count(0),value(""){}size_t count;std::string value;};templatetypenameTclassRingBufferBase{public:virtual~RingBufferBase()=default;virtualboolpush(constTvalue)=0;virtualboolisLoop()=0;virtualboolpop(Tvalue)=0;virtualboolisEmpty()=0;// 检查数值是否是2的幂次方staticboolisPowerOfTwo(size_t n){returnn!=0(n(n-1))==0;}virtualintgetOverwriteCount(){return0;}protected:// 构造函数放在 protected,只允许派生类调用explicitRingBufferBase(size_t buffer_size):buffer_size_(buffer_size),mask_(buffer_size-1),buffer(buffer_size){if(!isPowerOfTwo(buffer_size)){throwstd::invalid_argument("buffer_size must be a power of 2");}this-head.store(0,std::memory_order_relaxed);this-tail.store(0,std::memory_order_relaxed);}std::vectorTbuffer;size_t buffer_size_;size_t mask_;// buffer_size_ - 1, 用于取模(仅当 buffer_size_ 是 2 的幂次方时有效)alignas(64)std::atomicsize_thead;// 消费者真正可读的head索引(head_commit),是已经准备好数据的索引(MPSC中还有一个head是预留的slot,尚未填充数据,消费者不可读)alignas(64)std::atomicsize_ttail;// head/tail 分离缓存行,避免伪共享};// 单生产者单消费者无锁环形缓冲区模板基类templatetypenameTclassSpscRingBuffer:publicRingBufferBaseT{public:virtual~SpscRingBuffer()=default;// 消费者:从缓冲区弹出元素(push/pop 逻辑通用,pop 不变,push 由子类实现不同策略)boolpop(Tvalue){// WithLoop 模式下生产者也会写 tail,因此这里必须用 acquire,// 确保能看到生产者 release 写的最新 tail(防止读到过期值导致多读/乱序)size_t current_tail=this-isLoop()?this-tail.load(std::memory_order_acquire):this-tail.load(std::memory_order_relaxed);size_t current_head=this-head.load(std::memory_order_acquire);// acquire 确保能看到生产者 release 写的最新 head// 空检测:head == tail(索引不取模,直接用差值判断)if(current_head-current_tail==0){LOG_PRINT(INFO

相关新闻

洛谷 P5908:猫猫和企鹅 ← dfs 求树的深度

洛谷 P5908:猫猫和企鹅 ← dfs 求树的深度

【题目来源】 https://www.luogu.com.cn/problem/P5908 【题目描述】 王国里有 n 个居住区,它们之间有 n−1 条道路相连,并且保证从每个居住区出发都可以到达任何一个居住区,并且每条道路的长度都为 1。 除 1 号居住区外,每个居住…

2026/10/17 8:28:21 阅读更多 →
国家中小学智慧教育平台电子课本解析工具:一键获取官方教材的终极解决方案

国家中小学智慧教育平台电子课本解析工具:一键获取官方教材的终极解决方案

国家中小学智慧教育平台电子课本解析工具:一键获取官方教材的终极解决方案 【免费下载链接】tchMaterial-parser 国家中小学智慧教育平台 电子课本下载工具,帮助您从智慧教育平台中获取电子课本的 PDF 文件网址并进行下载,让您更方便地获取课…

2026/10/18 6:42:11 阅读更多 →
论文格式总是调不对,有哪些专业的AI论文工具推荐?

论文格式总是调不对,有哪些专业的AI论文工具推荐?

每到毕业季,不少同学一打开开题报告就犯难:选题定不下来、研究背景和意义分不清、文献综述无从下手、研究方法和技术路线逻辑混乱,盯着空白文档熬上几周也写不出完整框架。尤其是零基础、在职读研、跨专业的学生,对高校开题规范完…

2026/10/18 6:42:20 阅读更多 →

最新新闻

AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南

AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南

AI视频模型横向对比2026年9月版:5大开源模型实测数据与选型指南 2026年9月,开源AI视频生成模型已经形成完整梯队。本文横向对比5大可本地部署模型的核心参数、显存需求和实测速度,给出不同显卡的选型建议。文末附工作流模板和模型资源网盘链…

2026/10/18 15:53:16 阅读更多 →
pytest-django接入CI/CD全流程实战指南

pytest-django接入CI/CD全流程实战指南

两年多的时间里,我前后经手了三四个Django项目,每个项目走到后期都会遇到同一个尴尬:本地跑测试一片绿,合并代码进主干就翻车。最后定位下来,问题几乎都出在“测试只在本地跑过”这件事上。很多团队不是不想做自动化测…

2026/10/18 15:53:16 阅读更多 →
接口测试实战指南:从用例设计到自动化落地全梳理

接口测试实战指南:从用例设计到自动化落地全梳理

接口测试这东西,说实话,很多团队是"看起来在做,实际上没做透"。我在日常的测试工作里见过太多这样的情况:UI 测了半天,结果是前端把后端返回的错误信息包了一层好看的弹窗,接口本身返回 500 都没…

2026/10/18 15:53:16 阅读更多 →
spline-3d-integration - COMMON_PROBLEMS

spline-3d-integration - COMMON_PROBLEMS

常见问题与调试 这些是集成后才会浮出水面的实际问题。在完成任何 Spline 实现之前请阅读此内容。🚨 关键陷阱(会让你的网站崩溃)1. 滚动劫持 — 页面无法滚动 现象: 添加 Spline 后,整个页面停止滚动。用户被卡住。 原…

2026/10/18 15:53:16 阅读更多 →
spline-3d-integration - SKILL

spline-3d-integration - SKILL

name: spline-3d-integration description: “Use when adding interactive 3D scenes from Spline.design to web projects, including React embedding and runtime control API.” risk: safe source: community date_added: “2026-03-07” Spline 3D 集成技能 将 Spline…

2026/10/18 15:53:16 阅读更多 →
Python单元测试实战:pytest、fixture、mock与覆盖率全解析

Python单元测试实战:pytest、fixture、mock与覆盖率全解析

1. 为什么Python项目一定要补上单元测试1.1 它到底解决什么问题写到单元测试,我先说一个很实在的场景。某次我给一个内部数据处理服务加新功能,改完一个解析函数,自测时充分信心满满,结果上线当天就被日志里的报错打脸——一个我完…

2026/10/18 15:52:16 阅读更多 →

日新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/18 0:00:55 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/18 0:00:55 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/18 0:00:55 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 0:55:02 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/17 17:22:31 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →