当前位置: 首页 > news >正文

SPSC2环形队列

SPSC 无锁队列(2-slot)与 uint32_t 共享变量对比实验

目标

生产者线程将 [0 ~ N) 有序数据发送给消费者线程
对比两种实现:

  • ❌ uint32_t 共享变量(错误模型)
  • ✔ SPSC 无锁队列(正确模型)

验证:是否满足有序、不丢失、可消费


核心原则

不能在两个线程同时修改同个变量

SpscQueue2

SpscQueue2.h

#pragmaonce#include<stdint.h>/** * @brief 无锁环形队列 */class SpscQueue2{private:uint32_tm_buf[2];volatileuint8_tw;volatileuint8_tr;public:SpscQueue2();boolWrite(uint32_tv);boolRead(uint32_t&v);};

SpscQueue2.cpp

#include"SpscQueue2.h"#ifdefined(__ARM_ARCH)||defined(__aarch64__)||defined(__arm__)#defineDMB()__asmvolatile("dmb ish":::"memory")#else#defineDMB()do{}while(0)#endif/** * @brief 初始化 */SpscQueue2::SpscQueue2(){m_buf[0]=0;m_buf[1]=0;w=0;r=0;}/** * @brief 写入(生产者线程) */bool SpscQueue2::Write(uint32_tv){uint8_tnext=(w+1)&1;if(next==r)returnfalse;// fullm_buf[w]=v;// 发布顺序DMB();w=next;returntrue;}/** * @brief 读取(消费者线程) */bool SpscQueue2::Read(uint32_t&v){if(r==w)returnfalse;// emptyv=m_buf[r];// 消费顺序DMB();r=(r+1)&1;returntrue;}

测试

main.cpp 反例

#include<iostream>#include<thread>#include<atomic>volatileuint32_tg_data=0;std::atomic<bool>start_flag{false};std::atomic<bool>stop_flag{false};staticconstuint32_tMAX=100000;voidwriter(){while(!start_flag.load());for(uint32_ti=0;i<MAX;i++){g_data=i;}stop_flag.store(true);}voidreader(){while(!start_flag.load(std::memory_order_acquire));uint32_texpect=0;uint32_terror=0;uint32_tv;while(expect<MAX){v=g_data;if(v!=expect){std::cout<<"ERROR: expect "<<expect<<" got "<<v<<std::endl;error++;expect=v;}expect++;}std::cout<<"unsafe done, error = "<<error<<std::endl;}intmain(){std::cout<<"start..."<<std::endl;std::threadt1(writer);std::threadt2(reader);start_flag.store(true);t1.join();t2.join();std::cout<<"finish"<<std::endl;}

C:\Users\PC\CLionProjects\untitled23\main1.exe
start…
ERROR: expect 1 got 0
ERROR: expect 1 got 99999
unsafe done, error = 2
finish

main.cpp 正例

#include<iostream>#include<thread>#include<atomic>#include"SpscQueue2.h"SpscQueue2 q;std::atomic<bool>start_flag{false};std::atomic<bool>stop_flag{false};staticconstuint32_tMAX=100000;voidwriter(){while(!start_flag.load(std::memory_order_acquire));for(uint32_ti=0;i<MAX;){if(q.Write(i))i++;}stop_flag.store(true,std::memory_order_release);}voidreader(){while(!start_flag.load(std::memory_order_acquire));uint32_texpect=0;uint32_tv;uint32_terror=0;while(expect<MAX){bool got=false;while(q.Read(v)){got=true;if(v!=expect){std::cout<<"ERROR: expect "<<expect<<" got "<<v<<std::endl;error++;expect=v;}expect++;}// writer结束 + queue空 → 退出if(stop_flag.load(std::memory_order_acquire)&&!got)break;}std::cout<<"reader done, error = "<<error<<std::endl;}intmain(){std::cout<<"start..."<<std::endl;std::threadt1(writer);std::threadt2(reader);start_flag.store(true,std::memory_order_release);t1.join();t2.join();std::cout<<"finish"<<std::endl;}

C:\Users\PC\CLionProjects\untitled23\cmake-build-debug\untitled23.exe
start…
reader done, error = 0
finish

http://www.jsqmd.com/news/652325/

相关文章:

  • 【观察】HPE Smart Choice赋能伙伴:交付快一步,赢单稳一筹
  • 【国家级AI安全审计框架】:融合NIST AI RMF与中国《生成式AI服务管理暂行办法》的12项强制检查项
  • Agent 记忆系统设计:短期、长期到知识图谱
  • 不止于点亮:在Efinix SapphireSoc软核上实现程序固化与独立启动的完整攻略
  • 从Pascal到Ampere:大模型推理显卡的架构演进与实战性能对比
  • Hermes全网爆火!彻底碾压OpenClaw
  • AI服务注册延迟超800ms?2024年最严苛生产环境实测:3种服务发现方案TPS对比(含Latency P999数据)
  • 五代十国历史梳理(公元 907 年 —979 年)【五代】
  • 2026年3月视频矩阵系统企业推荐,视频矩阵系统/ai数字人矩阵/短视频矩阵系统,视频矩阵系统公司有哪些 - 品牌推荐师
  • 【无人机控制】城市无人机混合多速率自适应扰动估计与稳定控制【含Matlab源码 15336期】
  • Redis怎样向Lua脚本传递动态参数
  • 从语音通话到会议系统:G.722.1编码器在实际项目中的选型与集成避坑指南
  • 生成式AI数据回流机制:为什么91.3%的私有化部署项目在6个月内因回流断流导致模型退化?——基于37家金融/医疗客户的真实故障复盘
  • VSCode远程:GLIBC冲突导致的连接失败
  • 从74系列TTL反相器到现代芯片:聊聊那些被我们忽略的‘扇出’与驱动能力设计
  • 【Android】AI agent智能助理⭐️内置豆包 deepseek⭐️Ai无限制创作助手 生成图片等
  • 避开Vitis HLS接口设计的坑:从Syn Report看ap_ctrl_hs、s_axilite与中断配置
  • 学历提升必看!2026优质机构大盘点 - 品牌测评鉴赏家
  • 用CubeMX+Keil五分钟搞定STM32F4 ADC配置:含多通道扫描模式实战
  • 别再傻傻分不清了!PyTorch中model.parameters()、named_parameters()和state_dict()的保姆级使用指南
  • 大专学历提升,正规机构选择指南 - 品牌测评鉴赏家
  • Android Studio中文语言包终极指南:三步打造完美中文开发环境
  • HPH的构造 简单拆解
  • P3722 [AHOI2017/HNOI2017] 影魔 - Link
  • 从CPU到GPU:给你的FunASR Docker镜像手动添加CUDA支持(以0.1.5版为例)
  • Zemax 物理光学传播:从基础理论到实际应用
  • ABAQUS实战技巧:集中质量与耦合约束的协同设置方法
  • Git for Windows v2.53.0(3)发布:修复CVE-2026-32631漏洞,防止NTLM哈希值泄露
  • CSS如何解决Flex布局在老版本安卓机兼容性_使用autoprefixer工具
  • 数智化转型提速 长沙冷链企业激活餐饮供应链发展新活力