读写锁分离的循环队列

简介: 在很多需要高性能的场合下,锁的设计一直是一个比较关键的问题。无锁队列、读写锁分离的队列在业界以及学术界都已经有很成熟的研究。在网上也有很多资料,但其实有很多实现都是错误的。最近在工作中帮忙追查一个线上问题时,就发现实现一个正确的版本是比较困难的事情。

在很多需要高性能的场合下,锁的设计一直是一个比较关键的问题。无锁队列、读写锁分离的队列在业界以及学术界都已经有很成熟的研究。在网上也有很多资料,但其实有很多实现都是错误的。最近在工作中帮忙追查一个线上问题时,就发现实现一个正确的版本是比较困难的事情。 

      背景:实现一个循环队列,队列长度已预先分配。支持不同线程的多写多读。

      原本的实现是对读和写分别使用了两个不同的锁来提升性能,但是在最早实现的时候并没有发现到线程间数据的同步修改会造成小概率读取脏数据导致线上服务有问题

复制代码
 1 size_t Queue::pop(int &value)
2 {
3 AutoLock lock(_poplock);
4 if (!empty()) {
5 value = _queue[_read];
6 ++ _read;
7 if (_read == _maxsize) {
8 _read = 0;
9 }
10 return 1;
11 }
12 return 0;
13 }
14
15 size_t Queue::push(int value)
16 {
17 AutoLock lock(_pushlock);
18 if (!full()) {
19 _queue[_write] = value;
20 ++ _write;
21 if (_write == _maxsize) {
22 _write = 0;
23 }
24 return 1;
25 }
26 return 0;
27 }
复制代码

      出现的问题原因是 _read 和 _write 是存在非法的状态(_read = _max_size)。考虑这种场景当_read = _write=_max_size-1时,如果一个线程执行了push操作,并停在if (_write == _maxsize).但是由于线程间的切换,有两个线程继续执行了pop操作,那么就存在一个线程取到了脏数据。

      修改的方法可以两种:1 将读写锁合并成一个锁,但是会降低性能 2 修改实现,使 _read 和 _write不存在非法状态

View Code

 

目录
相关文章
|
存储 编解码 调度
剖析ffmpeg视频解码播放:时间戳的处理
剖析ffmpeg视频解码播放:时间戳的处理
1145 0
ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
ffmpeg 命令提取音视频数据-ffmpeg导出h265裸流-ffmpeg导出h264裸流
429 0
|
Linux
如何看懂火焰图
如何看懂火焰图
1483 0
如何看懂火焰图
|
9月前
|
存储 人工智能 缓存
OSS 100Gbps/租户技术解读
本次分享由阿里云资深技术专家罗庆超解读OSS 100Gbps/租户技术,涵盖五个方面:技术概况、后端性能保障、网络接入优化、最后一公里优化及总结展望。介绍了如何通过高性能存储池、网络优化和客户端工具提升性能,确保用户享受高效稳定的对象存储服务,并展望了未来的技术挑战和发展方向。
178 14
|
自然语言处理 IDE 开发工具
通义灵码编程智能体上线,支持Qwen3模型
通义灵码最全使用指南,一键收藏。
128891 31
通义灵码编程智能体上线,支持Qwen3模型
|
Java 数据库连接 开发者
Java中的异常处理:从新手到专家
在Java编程的世界中,异常处理是每位开发者必须精通的技能。本文将引导您了解Java异常处理的基础知识,深入探讨高级技巧,并分享最佳实践,帮助您从初学者成长为熟练处理各种异常情况的专家。
|
存储 缓存 编解码
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
FFmpeg开发笔记(四):ffmpeg解码的基本流程详解
|
消息中间件 数据采集 Kubernetes
鲲鹏展翅凌云志:iLogtail社区2022年度开源报告
iLogtail 作为一款阿里云日志服务(SLS)团队自研的可观测数据采集器,拥有的轻量级、高性能、自动化配置等诸多生产级别特性,可以部署于物理机、虚拟机、Kubernetes 等多种环境中,用于采集文件、容器输出、指标等各类可观测数据。iLogtail 的核心定位是帮助开发者构建统一的数据采集层,助力可观测平台打造各种上层的应用场景;此外,对于一些寻求轻量计算的场景,也可以使用 iLogtail 承担一些数据聚合、数据过滤、数据路由等功能。
16318 3
鲲鹏展翅凌云志:iLogtail社区2022年度开源报告
|
存储 固态存储 关系型数据库
MySQL 8.0:无锁可扩展的 WAL 设计
从MySQL 8.0开始,设计了一套无锁的写log机制,其核心思路是引入recent_written,允许不同的mtr,同时并发地写Log Buffer的不同位置。
325 0