这个是一个用c++ 11标准实现的无锁非阻塞链表队列,通过增加一个dummy节点,解偶合链表头指针和尾指针。使得当只有一个生产者和一个消费者时,进队和出队都无需加锁,进队操作的是尾指针,出队操作的是头指针,互不干涉。对于多个生产者且单个消费者时,只需要对尾指针加锁保护,而头指针不需要加锁。反之,对于单生产者且多消费者时,只需要对头指针加锁保护而尾指针不需要加锁。如果是多生产者和多消费者,那么头尾指针各自加锁保护。同时,队列内部会对节点进行缓存,避免重复的内存分配以提高性能。

在双cpu的机器上测试,性能比boost实现的单生产者和单消费者队列boost::lockfree::spsc_queue快6到7倍。

//对模板使用别名,方便使用(说明:NullMutex是一个空锁,是一个自旋锁spin_lock)

//单生产者和单消费者

template  using  spsc_queue = TDoubleLockLinkedNonBlockingQueue;

//多生产者和单消费者

template  using  mpsc_queue = TDoubleLockLinkedNonBlockingQueue;

//单生产者和多消费者

template  using  spmc_queue = TDoubleLockLinkedNonBlockingQueue;

//多生产者和多消费者

template  using  mpmc_queue = TDoubleLockLinkedNonBlockingQueue;

//使用例子:

//定义一个单生产者和单消费者队列

spsc_queue queue;

//进队

queue.push(1);

//出队

int value;

if(queue.pop(value))

{

printf("value = %d \n",value);

}

下文测试例子在E5-2620 v3 双cpu的机器上的运行结果:

单生产者[1]--单消费者[1]模型测试 数据请求[count=100000000]:

NullMutex TDoubleLockLinkedNonBlockingQueue :  花时 3.010000 秒

boost::lockfree::spsc_queue :  花时 19.312000 秒

linux 用mutex定义一个linkedlist,一个高性能无锁非阻塞链表队列相关推荐

  1. 一个高性能无锁非阻塞链表队列

    这个是一个用c++ 11标准实现的无锁非阻塞链表队列,通过增加一个dummy节点,解偶合链表头指针和尾指针.使得当只有一个生产者和一个消费者时,进队和出队都无需加锁,进队操作的是尾指针,出队操作的是头 ...

  2. 一种高性能无锁队列设计

    分布式与多核处理器在共享资源的情况下均要求在线程安全完成提交的任务,在多线程并发处理大量数据任务情况下为解决多生产者多消费者保证任务队列线程安全设计查找到一种高性能无锁队列设计,进行学习.研究. 主要 ...

  3. 你应该知道的高性能无锁队列Disruptor

    1.何为队列 听到队列相信大家对其并不陌生,在我们现实生活中队列随处可见,去超市结账,你会看见大家都会一排排的站得好好的,等待结账,为什么要站得一排排的,你想象一下大家都没有素质,一窝蜂的上去结账,不 ...

  4. java 无锁框架_高性能无锁并发框架 Disruptor,太强了!

    Java技术栈 www.javastack.cn 关注优质文章 Disruptor是一个开源框架,研发的初衷是为了解决高并发下队列锁的问题,最早由LMAX提出并使用,能够在无锁的情况下实现队列的并发操 ...

  5. linux socket 套接字状态 EAGAIN EWOULDBLOCK EINTR 与非阻塞 简介

    EWOULDBLOCK:用于非阻塞模式,不需要重新读或者写 EINTR:指操作被中断唤醒,需要重新读/写 在Linux环境下开发经常会碰到很多错误(设置errno),其中EAGAIN是其中比较常见的一 ...

  6. 【Linux Socket C++】为什么IO复用需要用到非阻塞IO?EAGAIN的简单介绍与应用

    目录 为什么IO复用需要非阻塞的IO EAGAIN的介绍 EAGAIN的应用 为什么IO复用需要非阻塞的IO 我们可以先看一下官方的回答: 在Linux命令行输入:man 2 select 找到[BU ...

  7. linux 用mutex定义一个linkedlist,【基于LINUX的操作系统实验教程最终版材料】

    (基于LINUX的操作系统实验教程)(最终版) <基于LINUX的操作系统实验教程.doc>由会员分享,可免费在线阅读全文,更多与<(基于LINUX的操作系统实验教程)(最终版)&g ...

  8. Linux学习之系统编程篇:管道设置为非阻塞及管道的读写行为

    一.管道设置为非阻塞 管道默认读写两端都是堵塞属性,那么怎能才能设置成非阻塞呢? (1)设置读端非阻塞 获得原来的属性 flag: int flags = fcntl(fd[0], F_GETFL); ...

  9. gitclone 一个tag的地址_一个无锁队列和FreeList实现

    代码实现了这篇文章中的无锁队列. fangcun:简单,高效,实用的非阻塞(无锁)和阻塞并行队列算法​zhuanlan.zhihu.com 无锁队列需要实现一个FreeList来避免一个线程释放了结点 ...

最新文章

  1. LA 5717枚举+最小生成树回路性质
  2. linux批量umount脚本,Linux下批量ping某个网段ip的脚本
  3. Radio Button无法对应选择的踩坑实例
  4. 黑客大神用什么杀毒?Windows自带的就够,只是加了亿点微小的强化
  5. Android SystemServiceManager分析
  6. 【论文解读】NN如何在表格数据中战胜GBDT类模型!
  7. linux(CentOs6)下jdk安装,mysql安装,tomcat安装,及web项目部署
  8. 推荐一个yaml文件转json文件的在线工具
  9. 【DP】晨练计划(ybtoj)
  10. [转]C#网络编程(同步传输字符串) - Part.2
  11. 《统一沟通-微软-实战》-3-部署-Exchange 2010-2-自定义安装
  12. 万能转换器boost::lexical_cast
  13. 数据库周刊53丨2020数据风云人物及“年度最佳创新产品奖“揭晓;易鲸捷与平安科技达成战略合作;腾讯云TDSQL品牌升级;SQL等价改写;MySQL数据备份;Redis万字详解……
  14. 魔兽争霸---兽族打法
  15. 解决Maven下载速度缓慢问题
  16. win7右键菜单管理_电脑右键新建不见了怎么办 电脑右键新建不见了解决方法【详解】...
  17. 超体故事:写作,我想少一些功利多一点真诚
  18. oracle权限培训,【必看】Oracle用户、权限、角色管理
  19. linux u8 u16 u32 u64,C 语言printf打印各种数据类型的方法(u8/s8/u16/s16.../u64/doub
  20. ASP.NET MVC俗气的罗斯文示例代码

热门文章

  1. 在收购 Sun 的六年后,Oracle 终于瞄准了 Java 的非付费用户
  2. 教你实践ASP.NET Core Authorization(免看文档教程)
  3. 【QGIS入门实战精品教程】4.3:QGIS属性表按字段链接外部属性数据
  4. Android之RxPermissions用kotlin写没反应
  5. 剑指offer之判断链表是否包含环
  6. mysql分页原理和sqlserver里面序列的用法
  7. c均值算法的设计与实现_如何使用C链表实现 LRU 算法
  8. python写小猪佩奇_python之小猪佩奇
  9. 数学中不可能实现的图形
  10. 真·抬头发票!| 今日最佳