在一读一写限制下,无锁环形队列的实现

简介:

环形一读一写队列中,不需要担心unsigned long溢出问题,因为溢出后自动回归,相减值还会保留。

示例一(注:Max_Count 必须为 2 的指数,即:2, 4, 8, 16...):

None.gif //  队列尺寸
None.gif
#define Max_Count    4096
None.gif #define Max_Mask     4095      //  = Max_Count - 1
None.gif
None.gif //  变量
None.gif
void*          List[Max_Count];
None.gifunsigned  long  Push_Count;
None.gifunsigned  long  Pop_Count;
None.gif
None.gif //  初始化队列
None.gif
void InitQueue()
ExpandedBlockStart.gif {
InBlock.gif   Push_Count  = 0;
InBlock.gif   Pop_Count   = 0;
InBlock.gif   memset(List, 0, sizeof(List));
ExpandedBlockEnd.gif}

None.gif
None.gif //  加入
None.gif
bool Push( void* AData)
ExpandedBlockStart.gif {
InBlock.gif   if (Push_Count - Pop_Count < Max_Count)
ExpandedSubBlockStart.gif   {
InBlock.gif      List[Push_Count & Max_Mask] = AData;
InBlock.gif      Push_Count++;
InBlock.gif      return true;
ExpandedSubBlockEnd.gif   }

InBlock.gif   else
InBlock.gif      return false;
ExpandedBlockEnd.gif}

None.gif
None.gif //  取出
None.gif
void* Pop()
ExpandedBlockStart.gif {
InBlock.gif   // 初始化
InBlock.gif
   void* result = NULL;
InBlock.gif
InBlock.gif   // 判断是否为空
InBlock.gif
   if (Push_Count != Pop_Count)
ExpandedSubBlockStart.gif   {
InBlock.gif      result = List[Pop_Count & Max_Mask];
InBlock.gif      Pop_Count++;
ExpandedSubBlockEnd.gif   }

InBlock.gif
InBlock.gif   // 返回结果
InBlock.gif
   return result;
ExpandedBlockEnd.gif}

None.gif


示例二(注:Max_Count >= 2):
None.gif //  队列尺寸
None.gif
#define Max_Count    4096
None.gif #define High_Index   4095      //  = Max_Count - 1
None.gif
None.gif //  变量
None.gif
void*          List[Max_Count];
None.gifunsigned  long  Push_Count;
None.gifunsigned  long  Push_Index;
None.gifunsigned  long  Pop_Count;
None.gifunsigned  long  Pop_Index;
None.gif
None.gif //  初始化队列
None.gif
void InitQueue()
ExpandedBlockStart.gif {
InBlock.gif   Push_Count  = 0;
InBlock.gif   Push_Index  = 0;
InBlock.gif   Pop_Count   = 0;
InBlock.gif   Pop_Index   = 0;
InBlock.gif   memset(List, 0, sizeof(List));
ExpandedBlockEnd.gif}

None.gif
None.gif //  加入
None.gif
bool Push( void* AData)
ExpandedBlockStart.gif {
InBlock.gif   if (Push_Count - Pop_Count < Max_Count)
ExpandedSubBlockStart.gif   {
InBlock.gif      List[Push_Index] = AData;
InBlock.gif      Push_Count++;
InBlock.gif      if (Push_Index == High_Index)
InBlock.gif         Push_Index = 0;
InBlock.gif      else
InBlock.gif         Push_Index++;
InBlock.gif
InBlock.gif      return true;
ExpandedSubBlockEnd.gif   }

InBlock.gif   else
InBlock.gif      return false;
ExpandedBlockEnd.gif}

None.gif
None.gif //  取出
None.gif
void* Pop()
ExpandedBlockStart.gif {
InBlock.gif   // 初始化
InBlock.gif
   void* result = NULL;
InBlock.gif
InBlock.gif   // 判断是否为空
InBlock.gif
   if (Push_Count != Pop_Count)
ExpandedSubBlockStart.gif   {
InBlock.gif      result = List[Pop_Index];
InBlock.gif      Pop_Count++;
InBlock.gif      if (Pop_Index == High_Index)
InBlock.gif         Pop_Index = 0;
InBlock.gif      else
InBlock.gif         Pop_Index++;
ExpandedSubBlockEnd.gif   }

InBlock.gif
InBlock.gif   // 返回结果
InBlock.gif
   return result;
ExpandedBlockEnd.gif}
目录
相关文章
|
3月前
|
存储 Kubernetes NoSQL
无锁队列实现及使用场景
无锁队列实现及使用场景
|
4月前
|
存储 安全 Java
《吊打面试官》从根上剖析ReentrantLock的来龙去脉
《吊打面试官》从根上剖析ReentrantLock的来龙去脉
|
7月前
|
Java 编译器 开发者
【并发编程的艺术】Java内存模型的顺序一致性
首先明确一点,顺序一致性内存模型是一个被理想化了的理论参考模型,提供了很强的内存可见性保证。其两大特性如下: 1)一个线程中的所有操作,必须按照程序的顺序来执行(代码编写顺序) 2)无论程序是否同步,所有线程都只能看到一个单一的操作执行顺序。每个操作都必须原子执行且立即对所有线程可见。
130 0
|
3月前
|
缓存 算法 Java
为什么需要无锁队列
为什么需要无锁队列
44 0
|
安全 Java
java实现无锁队列
写作目的 说到无锁,其实就是用cas,不过我在百度上搜java实现无锁队列的文章其实不多,所以自己用cas和volatile实现一下,线程安全那是必须的。
167 0
|
存储 算法 安全
【数据结构之旅】「线程锁算法专项」引领你走进CLH队列锁机制原理世界
【数据结构之旅】「线程锁算法专项」引领你走进CLH队列锁机制原理世界
101 0
【数据结构之旅】「线程锁算法专项」引领你走进CLH队列锁机制原理世界
|
存储 缓存 安全
Java并发编程系列之一并发理论基础
本系列文章开始Java并发编程的进阶篇的学习,为了初学者对多线程的初步使用有基本概念和掌握,前置知识会对一些基础篇的内容进行介绍,以使初学者能够丝滑入戏。
Java并发编程系列之一并发理论基础
|
算法 安全 Java
『图解Java并发编程系列』10张图告诉你Java并发多线程那些破事
『图解Java并发编程系列』10张图告诉你Java并发多线程那些破事
『图解Java并发编程系列』10张图告诉你Java并发多线程那些破事
|
安全 Java
面试突击45:为什么要用读写锁?它有什么优点?
读写锁(Readers-Writer Lock)顾名思义是一把锁分为两部分:读锁和写锁。
357 0
【漫画】JAVA并发编程 如何解决原子性问题
线程切换导致了并发编程中的原子性问题,那么如何解决原子性问题呢?互斥锁来帮你搞定它!