无锁队列相关

无锁队列相关无锁队列正常的队列在多线程的情况下进行使用时 需要对其进行锁操作避免临界区冲突问题 在思考这个问题的时候 针对的环境是多线程情况下插入不同的队列元素 在这种环境中要保证队列安全 无锁队列本质上还是一个基于锁的操作 就是将 head 和 tail 进行了锁保护 而不是针对整个队列的锁保护 CAS 原子操作 一个针对每个变量的锁 CAS CompareAndSe 是个 CPU 指令 X86 下对应的是 CMPXCHG 汇编指令 通过指令的返回值可以确定有没有对目标数据完成赋值 如果有的话 就认为加了锁 基于

无锁队列

CAS原子操作 – 一个针对每个变量的锁

bool CAS(*addr, oldVal, newVal); 
lock(); exec(); unlock(); 

CAS操作和上面的主要的不同点就是CAS只能针对一个变量进行一个原子操作;本质上就是CAS取代了lock的锁操作,然后修改数据结构使临界区更小。CAS本身依旧是个锁。修改了数据结构之后将临界区粒度缩小到一个变量上,然后以CAS的形式进行保护,最终就是所谓的无锁队列。

适用场景

适用在每秒处理十几万元素的时候进行考虑,每秒几百、几千个元素性能提升不大;

无锁队列实现

  • 链表的dummy(虚拟)节点,仅仅作为一个节点使用,并不具备存储的功能;可以方便链表的管理,没太大用,和具体实现细节有关;

CAS和无锁队列是怎么产生联系的?CAS本质上不也是个锁吗

本质上无锁队列就是基于CAS的锁粒度更新的、锁内置在队列结构中的一个队列;

锁的保护粒度

锁的保护粒度越小,效率执行越快;

boost库中的无锁队列

boost::lockfree实现了三种无锁数据结构,分别如下:

#include "boost/lockfree/queue.hpp" 

boost::lockfree::queue

一个无锁的 多生产者 / 多消费者 队列。

boost::lockfree::stack

一个无锁的 多生产者 / 多消费者 栈。

boost::lockfree::spsc_queue

一个无锁的 单生产者 / 单消费者 队列,通常被称为环形缓冲区

example中的无锁队列 – 单写单读的无锁队列

插入元素

  1. 首先将待插入元素设置到back中
  2. 调用push进行添加

优势

整个的优势就在于减少malloc的次数:

  • 一个是malloc chunk的概念:一次性申请N个元素空间
  • 一个是缓冲的概念,就是缓冲一个chunk块先不释放资源,然后需要申请的时候直接用上去;多个的话就释放掉前面的几个chunk块;
  • 锁的粒度小,等待不需要冗余等待

CAS的应用

example中的无锁队列 – 多写多读的无锁队列

涉及到的代码为ArrayLockFreeQueue.h 和 ArrayLockFreeQueueImp.h

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/226626.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月16日 下午10:30
下一篇 2026年3月16日 下午10:30


相关推荐

  • Pycharm设置模板

    Pycharm设置模板新建脚本文件模板 路径 settings editor fileandcodet pythonscript 编辑内容 coding utf 8 author wch file NAME py time DATE TIME 效果

    2026年3月17日
    2
  • ext.apply ext.applyIf ext.extend的区别[通俗易懂]

    ext.apply ext.applyIf ext.extend的区别[通俗易懂]Ext.apply、Ext.applyIf和Ext.extend:_sunExt.apply、Ext.applyIf和Ext.extend:2008年07月25日星期五10:48Ext.apply、Ext.applyIf和Ext.extend:Ext.apply(obj,config,[defaults])将config对…

    2022年7月28日
    5
  • cnpm安装方法「建议收藏」

    cnpm安装方法「建议收藏」cnpm安装方法cnpm安装方法:npminstall-gcnpm–registry=https://registry.npm.taobao.org

    2022年10月11日
    4
  • HTTP和HTTPS协议,看一篇就够了

    HTTP和HTTPS协议,看一篇就够了一、前言:我们上网很简单,只需要通过网络服务商开通端口就可以了,每天都在上网,有留意到访问网站链接有什么共同点吗?为什么需要但是为什么要讲HTTP和HTTPS呢?二、HTTP和HTTPS发展历史当我们打开谷歌浏览器输入www.12306.cn,回车很快在浏览器上就看到页面,其中的浏览器就是客户端,负责接受浏览器的是服务器,两者的通信是通过HTTP协议。什么是HTTP?…

    2022年4月29日
    76
  • java多线程-学习总结(完整版)

    java多线程-学习总结(完整版)这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居中、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML图表FLowchart流程图导出与导入导出导入欢迎使用Markdown编辑器你好!这是你第一次使用Markdown编辑器所展示的欢迎页。如果你想学习如何使用Mar

    2022年7月7日
    20
  • mac idea激活码2021(JetBrains全家桶)

    (mac idea激活码2021)这是一篇idea技术相关文章,由全栈君为大家提供,主要知识点是关于2021JetBrains全家桶永久激活码的内容https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~70YZDJVTFP-eyJsaWNlb…

    2022年3月27日
    111

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号