无锁队列的环形数组实现(Lock Free Queue Implementation in Ring Array)

限时加码!20+主流AI编程工具免费用 购周边加赠Coding Plan Lite,Claude Code、Cursor等即刻畅享,学习进阶更高效! 阅读详情

在网络服务器中,往往需要对数据进行高并发的读写操作。最原始的方式是对数据缓冲队列进行加锁(Mutex Lock),以完成的线程间的同步与互斥。但操作系统对资源进行加锁与解锁需要耗费很多时间,对于时间要求比较高或者要求迅速响应的服务器,锁的方式很有可能不能满足系统设计的要求。于是寻求设计一种不加锁也可以完成互斥访问的数据缓冲队列。

无锁队列的原理,首先可以参阅陈皓老师写的文章(http://coolshell.cn/articles/8239.html),其中有关于CAS等原子操作的介绍,使用链表的无锁队列的实现,以及可能面临的ABA问题。文中也给出了使用数组的的无锁队列的实现方案,但文中的方案只能存储一些较小的数据类型,如32位数据等。使用链表的无锁队列,元素每次入队和出队都涉及内存的申请和释放,内存IO的频繁操作不免要影响到系统效率。使用数组的无锁队列避免了内存的频繁操作,实现起来也清晰简洁。

Google的搜索结果中,无锁队列大部分都是基于链表的,数组形式的实现方案非常少。无锁队列的数组其实是一个环形数组(Ring Array),所有的入队和出队操作都是对该数组的内存进行操作。一个无锁队列的环形数组实现的C++定义如下:

class LockFreeQueue
{
public:
	LockFreeQueue(int s = MAX_SIZE_OF_RING_BUFFER);
	~LockFreeQueue();

	bool InitQueue(void);

	bool EnQueue(const ItemT & ele);

	bool DeQueue(ItemT * ele);

	//__sync_bool_compare_a
【信息科学与工程学】【数据中心】第三十五篇 云计算数据中心的学科知识04 编号学科(课程)核心知识点在云计算/云存储/云网络/云安全/云MaaS中的作用代表教材/资料/论文 + 数学方程式列表工业界应用D1421​云原生数据库:TiDB​HTAP(混合事务/分析处理)、分布式SQL、水平扩展、强一致(Raft)、自动故障恢复、与MySQL兼容、TiFlash列式引擎提供弹性扩展的分布式数据库;支撑高并发在线交易与实时分析教材:《TiDB in Action》PingCAP(2020) 论文:《TiDB: A Raft-based HTAP Database》(2017) 阅读详情

相关推荐

libReactor:libReactor是一个轻量级的网络编程框架

libReactor libReactor被设计为用于消息处理的轻量级网络编程框架。 它基于事件,并支持并发处理。 它非常易于使用,并且demo文件夹中提供了demo示例。 新的功能: 答:可以通过更改NUM_USERVER_DATA_READER / USERVER_BUFFER_SIZE / NUM_USERVER_DATA_PROCESSER等参数来调整服务器性能。 B.可以在不更改服务层代码的情况下配置包括服务器数据处理程序和客户端数据处理程序在内的数据处理程序,因为在创建数据处理程序实例时采用了简单的反射技术。

Go学习笔记—基于Go的进程间通信

IPC(Inter-Process Communication 进程间通信) 一般方法:(1) 半双工Unix管道 (2) FIFOs(命名管道) (3) 消息队列 (4) 信号量 (5) 共享内存 (6) 网络Socket (7) RPC(远程过程调用)

koooooooo5的博客 9989

userver-datamgr:基于PostgreSQL(永久数据),Redis(临时数据)和Adminer(数据库UI接口)的数据管理微服务堆栈

uServer DataMgr 数据管理微服务堆栈基于 (永久数据), (临时数据), (数据库UI接口)和 (定期备份和还原工具)的自定义实现。 它是堆栈项目的一部分。 准备环境 复制环境模板文件... cp adminer/.env.template adminer/.env cp backup/.env.template backup/.env cp postgres/.env.template postgres/.env ...并进行相应的编辑。 运行应用程序 docker-compose up --build 强制将数据库备份到AWS S3 docker exec -it userver-databackup sh -c " /scripts/backup.sh " 列出AWS S3上的数据库备份 docker exec -it userver-databackup

推荐开源项目:libreactor v3.0.0 - 轻量级事件驱动库

推荐开源项目:libreactor v3.0.0 - 轻量级事件驱动库 1、项目介绍 libreactor 是一个高效、轻量级的事件驱动库,它采用了最新的C语言编译,并且支持多种操作系统平台。它的核心在于帮助开发者创建高并发、低延迟的服务应用,尤其适合于处理大量的网络连接和I/O操作。该项目通过其简洁的API设计,让开发人员能够轻松地构建出高性能的网络服务器。 2、项目技术分析 libreact...

gitblog_00082的博客 707

【golang学习笔记】并发基础

Go语言从语言层面就支持并发。同时实现了自动垃圾回收机制goroutine是一种非常轻量级的实现,可在单个进程里执行成千上万的并发任务,它是Go语言并发设计的核心。说到底goroutine其实就是线程,但是它比线程更小,十几个goroutine可能体现在底层就是五六个线程,而且Go语言内部也实现了goroutine之间的内存共享。...

热爱编程的菜鸟 1849

Reactor框架学习笔记-初识Reactor

前言 我们写的大多数服务器程序结构: 其中难点就在DataCache和ClientService的耦合最大。Reactor框架就是帮我们来解决这个问题的。 核心: Reactor解决的核心问题就是对由SOCKET来的客户请求进行分离和调度。 名词解释: 事件源:引起线程调度和运行的事件点,利用SOCKET数据包和定时器的触发和事件的处罚。 基本原则: 1

ForYourFace的专栏 1086

探索未来软件开发的基石:libreactor v3.0.0

探索未来软件开发的基石:libreactor v3.0.0 项目介绍 libreactor是一个强大且高效的异步事件库,其最新版本v3.0.0为开发者提供了全新的性能体验。这个开源项目以C语言编写,旨在简化并发编程和处理大量网络连接的问题。通过使用libreactor,你可以构建高度可扩展的服务端应用程序,无论是在云环境还是本地部署,它都能提供卓越的性能。 项目技术分析 libreactor的核心...

gitblog_00139的博客 940

Web框架基准测试

Web Framework Benchmarks 这是许多执行基本任务(例如JSON序列化,数据库访问和服务器端模板组成)的Web应用程序框架的性能比较。每个框架都在实际的生产配置中运行。结果在云实例和物理硬件上捕获。测试实现主要是由社区贡献的,所有资源都可以从GitHub存储库中获得。 注意:我们使用“框架”一词来泛指平台,微框架和全栈框架。 在2013年3月的博客文章中,我们发布了比较几...

深度Java 3272

事件处理模式之Reactor

本文是上一篇《事件处理模式之Reactor()》的下一篇,上一篇主要介绍了reactor模式的基本理论,这一篇主要通过实例,来介绍Reactor模式的具体使用。在开始本文之前,有必要再说明一下,reactor的源码的地址:reactor源码, 感兴趣的读者朋友可以自己用svn客户端check out到本地。 如左图所示为reactor项目的基本结构,整体项目分为三个...

weixin_30855761的博客 264

php swoole性能,从swoole谈起性能比对

这篇文章我主要想备注的是:那些流行的框架一般性能都不是中上的,但这些流行框架的强大在于它的生态体系和易用性、可用性、扩展性等, 如果仅仅只是追求高性能, 他们其实并这不是个好选择。 像django, flask, yii, laravel, symfony等传统框架, 这些框架简单易用, 生态强大, 开发效率高,其实现实中大部分产品的性能并不像微信、微博这些巨头App需要超高并发性能要求,反而安全...

weixin_39734493的博客 1427

Libreactor 开源项目教程

Libreactor 开源项目教程 项目介绍 Libreactor 是一个高性能的网络库,专注于提供高效的异步事件处理机制。它基于 epoll 和 kqueue 等系统调用,旨在为开发者提供一个稳定且易于扩展的网络编程框架。Libreactor 的设计理念是轻量级和模块化,使得它非常适合用于构建高性能的服务器和网络应用。 项目快速启动 环境准备 在开始之前,请确保你的系统已经安装了必要的开发工具和...

gitblog_00146的博客 817

Array常用方法

二维数组通过for each遍历 核心代码 for each语句 双嵌套循环 public class Trap { public static void main(String[] args) { int a[][] = new int[][] {{1},{2,3},{4,5,6} }; for (int i=0;i<a.length;i++){...

SpringWaterLikeMe 217

Libreactor 项目常见问题解决方案

Libreactor 项目常见问题解决方案 项目基础介绍 Libreactor 是一个可扩展的事件驱动高性能 C 语言抽象库。它旨在为开发者提供一个高效的事件处理框架,适用于需要高性能和低延迟的应用场景。该项目的主要编程语言是 C,并且遵循 MIT 许可证。 新手使用注意事项及解决方案 1. 编译环境配置问题 问题描述:新手在尝试编译项目时,可能会遇到编译环境配置不正确的问题,导致编译失败。 解决...

gitblog_00294的博客 363

无锁数据结构--理解CAS、ABA环形数组

CAS同步原语 无锁算法 (lock-free algorithm) 和 无等待算法 (wait-free algorithm) 的近代起源可以追溯到Herlihy的论文 Wait-free synchronization,1991。在此之前,计算机硬件所提供的同步原语 (synchronization primitives) 只有原子寄存器 (atomic registers) 和少数经典原语比...

网络安全研究 4461

关于有名管道open时阻塞的问题

关于有名管道open时阻塞的问题1. 发现错误在学习Unix网络编程卷二的有名管道FIFO时,无意间犯下一个错误,故写此总结。 在写FIFO的服务器和客户端之间通信的代码时,服务器端主函数创建两个有名管道,然后分被以读写打开两个管道:readfd = open(FIFO1, O_RDONLY, 0);writefd = open(FIFO2, O_WRONLY, 0);然而在写客户端主函数代码时,

men_wen的博客 9189

循环数组无锁队列的原理与实现

本文介绍基于循环数组无锁队列的原理与实现

清风 3767

线程并发 概论

无锁队列的最初兴趣来自梁斌同志的一个英雄帖:http://coderpk.com/。 第一次看到这个题目的时候还不知道CAS,FAA等所谓的“原子操作”,但直觉上感觉,通过对读写操作的性能优化来达到大幅提高队列性能的方法是行不通的,就算读写操作全用汇编来写,也不会和正常的read及 write有数量级上的区别。后来搜索了一下lock free data structure,才知道了关于原子操作的

我有我的天空 594

释放无锁队列的力量:探索用循环数组实现无锁队列

在计算机科学领域,队列是一种常见的数据结构,用于在多线程或多进程环境中进行有效的消息传递和任务调度。然而,传统的队列实现通常使用锁来保护共享资源,这可能导致性能瓶颈和可伸缩性问题。为了克服这些限制,无锁队列应运而生。无锁队列通过采用特殊的算法和数据结构,使多个线程可以并发地访问队列,而无需使用锁来保护共享资源。其中,基于循环数组无锁队列是一种经典的实现方式。本文将深入探讨基于循环数组无锁队列的原理和优势。我们将介绍循环数组的基本概念,并解释如何通过适当的算法和技术实现无锁性。

Lion_Long的博客 1495

java环形无锁队列_无锁环形队列

1 #include "stdafx.h"2 #include 3 #include 4 #include 5 #include 6 #include 78 #define MAX_VIDEO_BUFF 1024910 structHeader11 {12 WORD wSize;13 char data[0];14 };1516 #define TEST_MSG_MAX_SIZE 1281...

weixin_39638603的博客 205
上一篇: 前向声明之“Error: pointer to incomplete class type is not allowed.”
下一篇: Debug和Release有什么区别
xclyfe
博客等级 码龄12年 2粉丝 12原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值