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

简介:

环形一读一写队列中,不需要担心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
|
3月前
|
安全 C++
c++ 无锁队列的简单实现
c++ 无锁队列的简单实现
70 0
|
3月前
|
存储 缓存 Java
剑指JUC原理-10.并发编程大师的原子累加器底层优化原理(与人类的优秀灵魂对话)
剑指JUC原理-10.并发编程大师的原子累加器底层优化原理(与人类的优秀灵魂对话)
25 1
|
6月前
|
存储 缓存 算法
每日一博 - 常见的数据结构
每日一博 - 常见的数据结构
36 0
|
11月前
|
安全 Java Spring
并发编程-01并发初窥
并发编程-01并发初窥
61 0
|
安全 Java
java实现无锁队列
写作目的 说到无锁,其实就是用cas,不过我在百度上搜java实现无锁队列的文章其实不多,所以自己用cas和volatile实现一下,线程安全那是必须的。
167 0
|
存储 算法 安全
【数据结构之旅】「线程锁算法专项」引领你走进CLH队列锁机制原理世界
【数据结构之旅】「线程锁算法专项」引领你走进CLH队列锁机制原理世界
101 0
【数据结构之旅】「线程锁算法专项」引领你走进CLH队列锁机制原理世界