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

无锁队列的设计

文章目录

  • 什么是无锁队列
    • 有锁队列:
    • 无锁队列:
  • 为什么需要无锁队列
    • 锁的局限:
  • SPSC的简单思路
    • 用ringbuffer实现SPSC无锁队列

什么是无锁队列

有锁队列:

通过互斥锁或其他同步机制保证线程安全的队列。

无锁队列:

通过原子操作来实现线程安全的队列,属于一种非阻塞队列。

为什么需要无锁队列

锁的局限:

  1. 线程阻塞带来的切换。
  2. 死锁风险。
  3. 性能瓶颈,高并发下锁竞争激烈,吞吐率下降。

SPSC的简单思路

用ringbuffer实现SPSC无锁队列

基本实现:头尾指针+固定大小的数组
存储任意类型:POD类型与非POD类型,模板类
FIFO类型:提供push和pop接口,用于生产者消费者模型
SPSC场景下线程安全:原子共享
性能优化:内存对齐,避免伪共享

什么是伪共享:

cpu的缓存是以缓存行为单位加载数据的
线程1修改A或线程2修改B都会造成缓存行标记为脏,从而导致缓存一致性协议将脏缓存行同步给其他核心,缓存行同步会导致性能下降。

因为A和B没有数据竞争。
所以我们要把A和B放在两个不同的缓存行。
下方用alignas(64)实现

#pragmaoncetemplate<typenameT,std::size_t Capacity>classRingBuffer{public:static_assert(Capacity&&!(Capacity&(Capacity-1)),"Capacity is not power of 2");RingBuffer():read_(0),write_(0){}~RingBuffer(){conststd::size_t r=read_.load(std::memory_order_relaxed);conststd::size_t w=write_.load(std::memory_order_relaxed);while(r!=w){reinterpret_cast<T*>(&buffer_[r])->~T();r=(r+1)&(Capacity-1);}}// 万能引用,完美转发template<typenameU>boolPush(U&&value){conststd::size_t w=write_.load(std::memory_order_relaxed);conststd::size_t next_w=(w+1)&(Capacity-1);if(next_w==read_.load(std::memory_order_acquire)){returnfalse;}new(&buffer_[w])T(std::forward<U>(value));write_.store(next_w,std::memory_order_release);returntrue;}boolPop(T&value){conststd::size_t r=read_.load(std::memory_order_relaxed);if(r==write_.load(std::memory_order_acquire)){returnfalse;}value=std::move(*reinterpret_cast<T*>(&buffer_[r]));reinterpret_cast<T*>(&buffer_[r])->~T();read_.store((r+1)&(Capacity-1),std::memory_order_release);returntrue;}std::size_tSize()const{conststd::size_t w=write_.load(std::memory_order_acquire);conststd::size_t r=read_.load(std::memory_order_acquire);return(w>=r)?(w-r):(Capacity-r+w);}private:alignas(64)std::atomic<std::size_t>read_;alignas(64)std::atomic<std::size_t>write_;alignas(64)std::aligned_storage_t<sizeof(T),alignof(T)>buffer_[];};RingBuffer<int,7>rb;
http://www.jsqmd.com/news/986498/

相关文章:

  • 兰州安宁区卖黄金实测:上门回收的水有多深?我把5家都试了一遍 - 奢佳美黄金珠宝
  • 天津卖黄金选本地门店 收的顶专业回收 透明交易远离回收套路 - 奢侈品回收评测
  • Unity毛发系统完整指南:从零开始创建逼真头发效果
  • 163MusicLyrics:跨平台音乐歌词提取与处理工具全解析
  • flask:sqlalchemy:指向值为null
  • 2026四川成都定制游怎么选导游|TOP8纯玩路线与熊猫+火锅+宽窄巷子体验解 - 随峰国旅
  • AI 编程时代,为什么脚手架依然不可替代?
  • 2026年上海搬家公司大盘解析 传统搬家套路梳理与日式一站式服务全面对比 - 信息热点
  • 智谱清言怎么转 PDF?借助 AI 导出鸭实现格式高效转换
  • 以正道致长远:重塑教培行业良性竞争生态 - 速递信息
  • 2026贵阳中考高考志愿填报机构怎么选?体制内就业破局指南 - 年度推荐企业名录
  • 珠海香洲区黄金回收行情与六家正规机构深度对比 - 上门黄金回收
  • 2026重庆名表回收战力TOP榜单:欧米茄积家横评,收的顶断层登顶 - 奢侈品回收测评
  • 2026年待办清单软件推荐:哪款日程管理工具真正好用?
  • 2026申请专利选哪种?自己申请还是找代理?广州专利代理机构优选TOP3测评|发明/实用新型/外观申报方式对比|成本明细、授权差距、适用场景、避坑决策全套指南 - 速递信息
  • GraphQL服务性能深度解析:Mercurius的3大优化策略与架构思考
  • IMO是谁?凭什么管全球航运?一篇读懂航运“总舵主”
  • 如何参考广东PCBA工厂排名选厂?FIRES方法论给出标准方案 - 资讯纵览
  • 2026 灵宝厨卫屋面地下室漏水瓷砖空鼓测评:吉修匠 99.8 分五星榜首 - 吉修匠
  • 成都西装定制权威指南:5 家顶级店铺深度测评 - 西装爱好者
  • 2026安徽中考分数不够普高怎么办?有什么出路? - 小张zc
  • 2026年上海酒店家具回收处理完全指南——找官方一站式回收商这样做最稳 - 年度推荐企业名录
  • Nx 构建系统与类型缓存:提升 TypeScript 开发效率的利器
  • 2026年室内淘气堡厂家推荐榜单:商场/儿童乐园/幼儿园/亲子主题乐园淘气堡品牌实力与性价比深度测评 - 品牌发掘
  • 新中国建成的最大运河,很多人还没听过
  • 住宅代理 vs 链式代理:区别、原理与应用场景全解析
  • 吃透Transformer:结合翻译实例逐步拆解
  • 2026年合肥汽车贴膜门店合规资质横向深度测评 - GrowthUME
  • PS5 NOR Modifier终极指南:修复PS5 NOR文件与UART通信的完整解决方案
  • 台球连锁加盟:万亿休闲经济下的新赛道与品牌格局 - 商业观察