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

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

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

// 队列尺寸
#define Max_Count    4096
#define Max_Mask     4095     // = Max_Count - 1

// 变量
void*          List[Max_Count];
unsigned long  Push_Count;
unsigned long  Pop_Count;

// 初始化队列
void InitQueue()
{
   Push_Count  = 0;
   Pop_Count   = 0;
   memset(List, 0, sizeof(List));
}

// 加入
bool Push(void* AData)
{
   if (Push_Count - Pop_Count < Max_Count)
   {
      List[Push_Count & Max_Mask] = AData;
      Push_Count++;
      return true;
   }
   else
      return false;
}

// 取出
void* Pop()
{
   // 初始化
   void* result = NULL;

   // 判断是否为空
   if (Push_Count != Pop_Count)
   {
      result = List[Pop_Count & Max_Mask];
      Pop_Count++;
   }

   // 返回结果
   return result;
}

示例二(注:Max_Count >= 2):

// 队列尺寸
#define Max_Count    4096
#define High_Index   4095     // = Max_Count - 1

// 变量
void*          List[Max_Count];
unsigned long  Push_Count;
unsigned long  Push_Index;
unsigned long  Pop_Count;
unsigned long  Pop_Index;

// 初始化队列
void InitQueue()
{
   Push_Count  = 0;
   Push_Index  = 0;
   Pop_Count   = 0;
   Pop_Index   = 0;
   memset(List, 0, sizeof(List));
}

// 加入
bool Push(void* AData)
{
   if (Push_Count - Pop_Count < Max_Count)
   {
      List[Push_Index] = AData;
      Push_Count++;
      if (Push_Index == High_Index)
         Push_Index = 0;
      else
         Push_Index++;

      return true;
   }
   else
      return false;
}

// 取出
void* Pop()
{
   // 初始化
   void* result = NULL;

   // 判断是否为空
   if (Push_Count != Pop_Count)
   {
      result = List[Pop_Index];
      Pop_Count++;
      if (Pop_Index == High_Index)
         Pop_Index = 0;
      else
         Pop_Index++;
   }

   // 返回结果
   return result;
}

时间: 2024-09-17 00:12:29

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

无锁数据结构(Lock-Free Data Structures)

原文:无锁数据结构(Lock-Free Data Structures) 一个星期前,我写了关于SQL Server里闩锁(Latches)和自旋锁(Spinlocks)的文章.2个同步原语(synchronization primitives)是用来保护SQL Server里的共享数据结构,例如缓存池里的页(通过闩锁(Latches)),锁管理器哈希表里的锁(通过自旋锁(Spinlock)).接下里你会看到越来越多的全新同步原语(synchronization primitives),即所谓的

Java 高并发四:无锁详细介绍_java

在[高并发Java 一] 前言中已经提到了无锁的概念,由于在jdk源码中有大量的无锁应用,所以在这里介绍下无锁. 1 无锁类的原理详解 1.1 CAS CAS算法的过程是这样:它包含3个参数CAS(V,E,N).V表示要更新的变量,E表示预期值,N表示新值.仅当V 值等于E值时,才会将V的值设为N,如果V值和E值不同,则说明已经有其他线程做了更新,则当前线程什么 都不做.最后,CAS返回当前V的真实值.CAS操作是抱着乐观的态度进行的,它总是认为自己可以成功完成 操作.当多个线程同时使用CAS操

《UNIXLinux程序设计教程》一2.4 读和写流

2.4 读和写流 一旦打开了一个流,就能对它进行读写,读写可以按无格式方式也可以按有格式方式进行.这一节介绍无格式I/O函数,下一节介绍有格式I/O函数.有以下三种类型的无格式I/O函数可供选择:1)字符I/O函数.这种函数每次读或写一个字符.2)行I/O函数.这种函数每次读写一行,每一行以换行符结束.3)块I/O函数.这种函数支持成块I/O,它们每次读写若干个对象,每个对象的大小是指定的.块I/O有时也称为二进制I/O.对象I/O或结构I/O. 2.4.1 字符I/O 如下三个字符输入函数每次

Python open()函数文件打开、读、写基础操作

说明:         python的文件读写和打开操作都有自己特定的函数和方法,操作起来很简单.下面就来简单的了解下python文件的文件基本操作方法有哪些. 一.Python open()函数文件打开操作     打开文件会用到open函数,标准的python打开文件语法如下: 1 open(name[,mode[,buffering]])     open函数的文件名是必须的,而模式和缓冲参数都是可选的.比如说有个a.txt的文本文件,存放在c:\text下,那么你要打开它可以这样操作:

从volatile解读ConcurrentHashMap(jdk1.6.0)无锁读

作者:绫萱 volatile常常用于修饰多线程共享变量,用来保证该变量的可见性.volatile的语意:某个写线程对volatile变量的写入马上可以被后续的某个读线程"看"到. volatile保证可见性的原理:volatile是通过在编译器生成字节码时,在对volatile变量进行读写指令序列的前后加入内存屏障,来禁止一些处理器重排序保证写入一定发生在读之前的这种happen-before关系.   简单理解:在本次线程内,当读取一个变量时,为提高存取速度,编译器优化时有时会先把变

连接或读、写数据库时,如何获得的ORACLE错误编号,并根据错误编号,弹出自定义的错误信息

问题描述 想要实现下面的功能,不知道该怎样写.TRY{对数据库的读.写.或连接操作:}CATCH(){获得错误编号:IF错误编号=-MESSAGEBOX("1111"):ELSEMESSAGEBOX("222"):}由于ORACLE的错误信息对于用户来说可读性不是很强,所以想要转化成用户可以理解的信息.因此需要首先CATCH到错误编号,找到该编号对应的错误类型,再将错误信息转化成通俗易懂的方式反馈给用户.请高手多多指教,谢谢 解决方案 解决方案二:你可以建一个错误信

Java的文件 读和写

1.流:它是通过缓冲机制将数据从生产者(如键盘.磁盘文件.内存或其他设备)传送到接受该数据的消费者(如屏幕.文件或者内存等)的这一过程的抽象.2.有关的Java包:Java.io包中包括许多类提供许多有关文件的各个方面操作.3.有关文件名及目录名的类:File 类独立于系统平台,利用构造函数File( String path).File(String path, String FileName).File(File dir, String name) 等创建出File 对象:再利用canRead

javascript-jquery为动态插入的checkbox绑定事件在IE8下无效果

问题描述 jquery为动态插入的checkbox绑定事件在IE8下无效果 //obj是checkbox对象,这些checkbox都是通过js方法动态插入html的 obj.click(function(){ var valueStr=""; var nameStr=""; // initObjs是所有的checkbox对象集合 initObjs.filter(":checkbox[name='"+name+"']:checked&qu

c++-如何在vc 平台读已知路径下的pdf文件,并插入图片?

问题描述 如何在vc 平台读已知路径下的pdf文件,并插入图片? 希望实现在vc2008平台上打开一个已知路径的pdf文件,并在指定位置插入图片,实质就是印章签名,搜索了百度,有人提到libhaur,但是这个好像不可以编辑已经存在的文件,只能新建一个pdf文件,然后再编辑 解决方案 试试itextsharp,是个处理pdf的dll,不知道有没有C++版的