当前位置: 首页 > 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.zskr.cn/news/1498245.html

相关文章:

  • 如何用99个公共Tracker服务器打造极速BT下载网络:Trackerslist完整指南
  • 兰州安宁区卖黄金实测:上门回收的水有多深?我把5家都试了一遍 - 奢佳美黄金珠宝
  • 天津卖黄金选本地门店 收的顶专业回收 透明交易远离回收套路 - 奢侈品回收评测
  • flask:sqlalchemy:指向值为null
  • 以正道致长远:重塑教培行业良性竞争生态 - 速递信息
  • 2026贵阳中考高考志愿填报机构怎么选?体制内就业破局指南 - 年度推荐企业名录
  • 珠海香洲区黄金回收行情与六家正规机构深度对比 - 上门黄金回收
  • IMO是谁?凭什么管全球航运?一篇读懂航运“总舵主”
  • 2026申请专利选哪种?自己申请还是找代理?广州专利代理机构优选TOP3测评|发明/实用新型/外观申报方式对比|成本明细、授权差距、适用场景、避坑决策全套指南 - 速递信息
  • 2026 灵宝厨卫屋面地下室漏水瓷砖空鼓测评:吉修匠 99.8 分五星榜首 - 吉修匠
  • Nx 构建系统与类型缓存:提升 TypeScript 开发效率的利器
  • 吃透Transformer:结合翻译实例逐步拆解
  • 2026年合肥汽车贴膜门店合规资质横向深度测评 - GrowthUME
  • 新中国建成的最大运河,很多人还没听过
  • 台球连锁加盟:万亿休闲经济下的新赛道与品牌格局 - 商业观察
  • 2026年贵阳高考志愿填报机构避坑指南|如何找到真正懂体制内就业的咨询师 - 年度推荐企业名录
  • MinerU技术架构深度解析:构建企业级文档智能处理引擎
  • 一轮复习——E.位运算模型总结
  • Java 线程核心 API 全解|守护线程、终止、join 与六大状态(面试必看)
  • 第223期方班学术研讨厅成功举办
  • 船上这5个小众岗位,能认出的都是老航运人!
  • Python入门(1):从环境搭建到内置函数核心精讲
  • 实景孪生赋能智慧监管 | 黎阳之光监狱全域透明智能化管理解决方案
  • 2025_NIPS_Neural Functional Transformers
  • 淮南初三考不上高中怎么办?——推荐淮南职业技术学院(中专部) - 我叫小周
  • CNN卷积神经网络学习笔记
  • 【分享】间歇性断食最新版[特殊字符]海量减肥菜谱|饿出真理|减肥必备
  • 2026 年 6 月腕表维保指南,深圳劳力士标识磨损失去光泽,深圳劳力士分享无损修复工艺与避坑小知识 - 亨得利官方维修中心
  • 2026报考指南:四川专升本上线率高的专科学校推荐 - 品牌2026
  • 2026年波兰电池/能源/储能技术展深度盘点:TOP5储能解决方案与欧洲市场前沿趋势解析 - 品牌发掘