news 2026/6/10 15:20:01

无锁队列的设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
无锁队列的设计

文章目录

  • 什么是无锁队列
    • 有锁队列:
    • 无锁队列:
  • 为什么需要无锁队列
    • 锁的局限:
  • 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;
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/10 15:15:06

大模型三类分类测评指标梳理

大模型整体分类&#xff1a;按模型能力分成判别型、生成型、推理型 3 大类&#xff0c;企业选型时依据业务场景对应查看测评指标&#xff0c;用来横向对比各大模型优劣。一、判别型大模型传统 AI&#xff1a;分类 / 打分 / 预测&#xff0c;输出类别 / 数值定位多用于风控识别、…

作者头像 李华
网站建设 2026/6/10 15:11:10

命令行管理文件 1

1.文件命名规则文件名里不能有/文件名不能超过 255 个字符要区分大小写目录也是文件&#xff0c;在同一路径下&#xff0c;两个不同类型文件不能同名2.目录管理2.1创建目录mkdir格式mkdir -选项 目录名选项选项功能-p递归创建目录&#xff0c;已存在目录不会被覆盖-v显示创建目…

作者头像 李华
网站建设 2026/6/10 15:08:51

CNN卷积神经网络学习笔记

1.卷积类比滤波器&#xff1a;用一个小的模板&#xff08;卷积核/滤波器&#xff09;在输入信号&#xff08;图像&#xff09;上滑动&#xff0c;对局部区域进行加权求和&#xff0c;从而改变或提取信号的某些特征。1.2卷积核,权重&#xff08;3*3里面具体的9个数&#xff09;可…

作者头像 李华
网站建设 2026/6/10 15:07:32

ctf show web入门110

这是一道典型的 PHP 代码审计与绕过题&#xff08;通常出现在 CTF 比赛中&#xff09;。题目核心在于通过 eval() 函数执行任意代码以获取 Flag。执行点&#xff1a; eval("echo new $v1($v2());");但是v1v2都被正则限制 被禁用的字符包括&#xff1a;绝大多数特殊符…

作者头像 李华
网站建设 2026/6/10 15:07:29

FreeRTOS-STM32-HAL库一步步移植教程

FreeRTOS-HAL库一步步移植教程下载FreeRTOS裁切文件创建HAL工程配置时钟配置时钟树配置时基源配置NVIC配置代码生成 code generstion移植测试引脚生成Keil工程项目移植FreeRTOS到Keil 并配置配置Keil配置include pathsFreeRTOSConfig.h 文件添加宏定义stm32f1xx_it.c 文件配置创…

作者头像 李华