无锁数据结构(一)

无锁数据结构 CAS Lock-free Data Structures CAS 比较并交换 compare-and-swap 无锁数据结构 “Lock-Free Data Structures”。 看到别人要10分资源分。我这里上传一个。有中文 + English 原文。 立即下载

无锁数据结构(一)

Andrei Alexandrescu

December 16, 2007

译者:张桂权

12/25/2007

(初稿阶段,没有得到许可不得引用,否则后果自负)

泛型编程(Generic<Programming>)被删除之后(我知道,认为母校(毕业的学校)要求一切,不仅仅是100%的个人时间,是非常天真的),对于本篇文章来说,到目前为止,就没有丰富的题材了。一个备选主题是构造器的讨论,尤其是前沿的构造器,异常处理和双角色(two-stage)对象构造。另一个主题——再瞥一眼Yaslander技术[2]——创建不完全类型的容器(比如,lists, vectors, maps),凭借一些有趣的技巧完全可以实现,但是没有标准容器的保证。

当两个主题都很喜欢的时候,他们又不能给无锁数据结构(lock-free data structures)一个机会,这可是所有多线程编程社区的共同期望。在今年的PLDI会议(http://www.cs.umd.edu/~pugh/pldi04/)上,Michael Maged展示了世界上第一个无锁内存分配器[7],这,在很多测试上,超越了其他更复杂,精心设计的基于锁的分配器。这是不久前出现的许多无锁数据结构和算法的最新成果,……不过,让我们从头开始吧。
 
1 何谓“无锁”
这就是曾经我最想问一个问题。作为一名真正的多线程程序员,我最熟悉基于锁的多线程算法。在经典的基于锁的编程中,不论何时如果你需要共享一些数据,那么你需要串行访问它。那些改变数据的操作必须是原子的,这样没有其它的线程干扰,并破坏数据的不变性。即使像++count_,这样简单的操作,其中count_是整数类型,也必须加锁,因为“++”确实是一个三步操作,但是没有必要原子操作。
 
总之,在基于锁的多线程编程中,你需要保证对竞争条件很敏感的共享数据上的任何操作,都通过加锁或解锁一个独占(mutex)来实现原子操作。锁上独占是非常明智的,只要锁上独占之后,你就可以执行几乎任意的操作,推心置腹的说,没有线程会欺骗你的共享状态。
 
确切的来说,当一个独占被加锁之后你的操作是随机的,也是有问题。比如说,你可以,读取键盘输入或执行一个缓慢的I/O操作,这就意味着你延迟了其它任何等待同一个独占的线程。糟糕的是,你可以决定,你想去访问其它的一些共享数据,并试图锁上它的独占。如果另外一个线程已经锁上了最后一个独占,并且试图去访问你的线程持有的第一个独占,马上两个进程都被挂起,所以你可以称之为“死锁”。
 
进入无锁编程。在无锁编程中你几乎不能以原子的方式做任何的事情。仅仅只有极少数的操作可以通过原子方式处理,这些限制使得无锁编程的方法更难了。(事实上,世界上大概有半打无锁编程专家,但是你真的不在此列。然而,庆幸的是,本文将给你提供基础的工具、参考书和热心,助你成为其中的一员)。作为这么一个稀有的框架的回报就是,你可以提供线程进度和线程之间的交互更好的保证。但是,无锁编程中你可以原子化处理的这些“少量的事”(small set of things)究竟是什么呢?事实上,允许实现任何无锁算法的最小的原子原语(atomic primitives)集是什么呢——如果存在这样一个集合?
 
如果你认为这是一个简单十足的问题,那有必要为它设立一个大奖?但是别人就这样干的。2003年,Maurice Herilihy因为其萌芽之作《无等待同步》而获得分布式计算领域的Edsger W.Dijkstra奖。(看看http://www.prodx.org/dijkstra/2003.html吧。其中还包括一个这篇论文的连接)。在这篇绝技(tour-de-force)论文中,Herlihy证明了建立无锁数据结构的好的和不好的原语。这促使了一个表面上很热火的硬件架构立即废弃,同时明晰未来的硬件中应该实现什么样的同步原语。
 
例如,在Herlihy的论文中给出的不可能的结果,表明原子操作,如,test-and-set(检测-设置)、swap(交换)、fetch-and-add(获取-增加)或即使是atomic queues(原子队列)都不适合同步两个以上的线程。(这实在让人感到惊讶,因为队列的原子push和pop操作应该提供非常强的抽象。)很精明的是,Herlihy还给出了通常的结果,证明了一些非常简单的结构足以实现支持任意数量线程的无锁算法。
 
最简单,最流行,并且贯穿本文的通用原语,是比较-交换(compare-and-swap,CAS)操作:
 
template <class T>
bool CAS(T* addr, T exp, T val)
{
       if (*addr == exp)
        {
                  *addr = val;
               return true;
      }
return false;
}
 
CAS用一个期望值来比较一个内存地址的内容,如果比较成功,则用一个新的值来替换这个内容(上下文)。这个过程是原子的。许多现代的处理器实现了CAS或等价不同位长的原语(为了更合理,我们把它作为template,假设一个实现采用元编程(metaprogramming)来约束可能的T)。一个让人称道的规则是,CAS能够原子的比较和交换的位越多,越容易用它来实现无锁数据结构。当今的32位处理器实现62位的CAS;比如,Intel的汇编器称之为CMPXCHG8(你将喜欢这些汇编器的助记术)。

---------------源文档------------------
Lock-Free Data Structures
Andrei Alexandrescu
December 17, 2007
http://erdani.org/publications/cuj-2004-10.pdf
最后一次访问时间:2007年12月30日
----------------------------------------

JMeter脚本录制-快速上手篇 有的项目应用场景下,压测时,需要考虑带宽因素,压测不只是压测接口,静态资源也要一起压测。一般来说,静态资源比较多,如果一个个手工去写请求,是比较繁琐的,此时,可以使用Jmeter的脚本录制功能。 步骤1,创建脚本录制模版。 JMeter菜单:文件>模版,下拉选择到Recording,点击“Create”按钮; 填写录制参数: hostToRecord:填写要录制的主机域名,例如,我们这里填入:www.baidu.com schemeToRecord:填写要录制的模式,例如,htt... 阅读详情

相关推荐

一文搞定 GitHub SSH Key:生成、配置、好处全攻略

本文详细介绍了如何配置GitHub SSH Key,实现免密安全认证。主要内容包括:SSH协议的四大优势(免密登录、安全性高、稳定省心、支持自动化);Git身份配置步骤;检查本地SSH Key;生成RSA密钥对;添加密钥到SSH代理;复制公钥到GitHub;测试连接。配置完成后,开发者可通过SSH地址克隆仓库,实现push/pull全程免密操作。该方案显著提升Git使用效率,同时保障安全性,是开发者必备技能。

qq_62904883的博客 958

聊聊并发(五)原子操作的实现原理

1    引言 原子(atom)本意是“不能被进一步分割的最小粒子”,而原子操作(atomic operation)意为”不可被中断的一个或一系列操作” 。在多处理器上实现原子操作就变得有点复杂。本文让我们一起来聊一聊在Inter处理器和Java里是如何实现原子操作的。 2    术语定义 术语名称 英文 解释 缓存行

要懂得舍得 1739

RPA 财务共享中心与RPA赋能

在和集团财务官交流的时候,客户经常会提到FSSC,其中有准备建立FSSC,正在建立FSSC,以及已建成FSSC正使用的,当中会有些对FSSC的疑虑和问题,所以花费些时间对FSSC进行了深入调研,从而也有幸拜读了王兴山、陈剑、梅震、钱自严等专业人士写的几本关于FSSC的书,对FSSC的前因后果有了更深入的认识,同时结合自己在FSSC的一些项目经验,故做了本次分享。 本文章主要分享财务共享中心以及R...

weixin_40244959的博客 2756

无锁队列设计思路以及简要代码

非并发的一写一读环形队列 读指针: 1、先判断是否有数据 2、读取数据 3、操作指针 写指针: 1、先判断空间是否足够 2、写入数据 3、操作指针· 所以代码也十分简单: bool putqueue(void* pData) { ST_NODE* ptr = NULL; do { ptr = pWrite; if ((uiQueueSize - ((pWrite + uiQueueSize - pRead) % uiQueueSize) - 1 > 0

hanhan的博客 979

用野火FPGA开发板(EP4CE10)手把手教你实现一个高精度频率计(附完整Verilog代码)

本文详细介绍了基于野火FPGA开发板(EP4CE10)实现高精度频率计的全过程,涵盖等精度测量法的核心原理、Verilog代码实现及优化技巧。通过实际案例演示,帮助开发者掌握1Hz-50MHz范围、精度达0.1%的频率计设计方法,并提供完整的工程代码和实测数据。

weixin_29261711的博客 439

自适应陷波器的原理与实现

x(t)是叠加有两个频率干扰信号的输入信号,s(t)是需要保留的有用信号,在输入信号中,我们只知道频率w1和w2,但不知道信号的幅度A和相位θ,自适应陷波器可以估计两个未知的幅度和相位值,这需要我们提供两路相互正交的单频信号,如cos(w1t)、sin(w1t),通过调整其权值,从而合成出与干扰信号完全相同的信号A1cos(w1t+θ1),从而实现干扰信号的滤除。采用LMS算法,在保证不损失其他有用信号的情况下,有效地抑制输入信号中某一频率的干扰,如需滤除多个频率,只需要增加相应的输入信号。

Melkiades2333的博客 6889

stm32f4 自旋锁_面试必备之深入理解自旋锁

本文出自:http://blog.onlycatch.com/post/自旋锁。我对原文做了一点补充与修改,我觉得这篇文章写的非常非常好。深入学习,不光可以深入掌握自旋锁,还能提高自己的编程思想。原文作者对于自旋锁的思考很棒,为他点个赞。在我的上一篇文章:《面试必备之乐观锁与悲观锁》 已经为大家对比了乐观锁与悲观锁。我们知道CAS算法是乐观锁的一种实现方式,CAS算法中又涉及到自旋锁,所以这里给大...

weixin_35756373的博客 528

SAP BASIS运维之三方SSL证书导入

事情的起因是我司SAP使用的SSL证书即将要到期了(上一个的SAP BASIS也辞职了),需要进行证书的更换。如上图所示,我司的证书有效期到2024年4月30日到期,需要提前预防并更换,防止过期后导致接口和访问出现问题。9.在弹出的框中,选择我们在第5个步骤中导出的转换结果存储地址,并选择导出的转换文件,点打开。12.最后一步也是关键的一步,不然就会无法更新证书,再点击左上角的个人安全环境,点另存为。10.在打开后的弹窗中,输入我们在第4个步骤中设置的密码。6.经过以上步骤后,我们获得了最终的证书文件。

fegda的专栏 1885

C++并发编程(七)无锁数据结构

《C++并发编程实战》笔记

CSSS_2021的博客 2332

Linux内核配置选项详解及编译过程

在内核编译完成后,可以通过重启系统并选择新编译的内核来使用它。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以在该菜单下选择需要编译进内核的设备驱动,也可以选择将设备驱动编译为模块。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。可以选择需要的网络协议和功能,并根据需要启用或禁用相应的选项。可以选择需要的调试选项,并根据需要启用或禁用相应的功能。可以选择需要的文件系统类型,并根据需要启用或禁用相应的选项。

TechGlide的博客 747

QGis软件 —— 5、QGis增加线,并对线进行绘制、旋转、缩放、移动等基本操作

QGis软件 —— 5、QGis增加线,并对线进行绘制、旋转、缩放、移动等基本操作

8245

无锁数据结构--理解CAS、ABA、环形数组

CAS同步原语 无锁算法 (lock-free algorithm) 和 无等待算法 (wait-free algorithm) 的近代起源可以追溯到Herlihy的论文 Wait-free synchronization,1991。在此之前,计算机硬件所提供的同步原语 (synchronization primitives) 只有原子寄存器 (atomic registers) 和少数经典原语比...

网络安全研究 4486

YOLOv11 改进 - SPPF模块 | 发论文神器!LSKA注意力改进SPPF,增强多尺度特征提取能力,高效涨点!!!

本文介绍了Large Separable Kernel Attention (LSKA)模块及其在YOLOv11中的结合应用。LSKA旨在解决Visual Attention Networks (VAN)使用大内核卷积时的计算效率问题,通过将2D深度卷积层的卷积核分解为级联的水平和垂直1-D卷积核,降低了计算复杂度和内存占用,且使VAN更关注物体形状。我们将集成LSKA的SPPF_LSKA模块引入YOLOv11,大量实验表明,改进后的模型在对象识别、检测、分割和稳健性测试上表现出色。

魔改工程师的博客 1279

无锁数据结构一

lock-free 什么是lock-free 无锁数据结构 无锁数据结构的实现主要基于两个方面:原子性操作和内存访问控制方法。下面先记录原子性操作相关知识。 原子性操作 原子性操作可以简单地分为读写(read and write)、原子性交换操作(read-modify-write,RMW)两部分。原子操作可认为是一个不可分的操作;要么发生,要么没发生,我们看不到任何执行的中...

LiuM150428的博客 627

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

基于锁的并发数据结构(一)

适用于并发的数据结构演化

Big_Tree712的专栏 294

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

数据结构基础(一)+ 打开轮盘锁

队列 队列为先进先出的数据结构类型。 我们可以通过数组来实现,也可以用链表来实现,通过一个指针或者数字标记记录头部和尾部的位置,出队列令头部pop,然后后移,入队列让尾部push,然后后移。 循环队列,意味着尾部后移到一定程度要绕回头部,形成一个环。可以节约空间。 经典算法题:BFS轮盘锁 栈 先进后出的数据结构类型。 我们只需要记录栈顶的位置即可,任何操作都是围绕栈顶进行的,当然,一些特定的情形...

优快云_Yong的博客 392

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

锁无关的(Lock-Free)数据结构(一)

锁无关的(Lock-Free)数据结构在避免死锁的同时确保线程继续在Generic沉默了一期之后(研究生的学业总是使人不得不投入百分之百的精力),这一期文章的可写内容突然多得令人似乎有点无所适从.例如,其中之一就是关于构造函数的讨论,特别是转发构造函数(forwarding co

vivi的技术博客 2973

无锁数据结构与并发控制:时序数据库TDengine应对海量设备同时写入的底层逻辑

同时,利用底层的 CAS(Compare-And-Swap)等原子操作指令,TDengine 甚至在内存缓冲区的分配与元数据修改环节也完全摒弃了传统的 Mutex 锁,让数据的流转如同在极其光滑的冰面上滑行,毫无阻力。如果这 10 万个并发的写入请求同时涌入传统的单一数据大表中,系统瞬间就会陷入死锁和极其严重的资源排队。通过“一设备一表”的巧妙物理隔离、无锁数据结构的底层应用以及极简的线程调度模型,TDengine 成功地在单台服务器上榨干了所有的硬件计算红利。一、 并发写入与全局锁的性能灾难。

2501_94024371的博客 259

无锁编程

研究下无锁编程,方向是消息队列,读写者的问题。现在有成熟的方案,就是ringBuffer,环形队列。还有是重写数据结构的,从底层改变,使用一些原语。boost就实现了几个无锁的数据结构。没有锁就需要原语,赋值语句和比较语句算不算原子操作呢?boost是把autoIncrement用汇编实现的,有没有必要?环形队列是理想的方法,在网络编程中还是很实用的。他针对的问题虽然很局限,实际上只有一个写者...

niuysfox的专栏 143

kfifo 一读一写无锁缓冲区中的memory barrier

Linux kernel实现了一个kfifo,支持一读一写线程的无锁操作。具体代码见kernel/kfifo.c。在2.6稍高一点的版本里都会涉及到memory barrier。本文稍微解释一下memory barrier。 先看一下简单的两行代码: 26 bool flag = true; 27 int tmp = 10; 26,27在现代的多核处理器里...

weixin_30763397的博客 205

752. 打开转盘锁

【代码】752. 打开转盘锁。

INGNIGHT的专栏 670

锁无关的数据结构与Hazard指针——操纵有限的资源

C/C++ Users Journal December, 2004锁无关的数据结构与Hazard指针操纵有限的资源 By Andrei Alexandrescu and Maged Michael刘未鹏(pp_liu@msn.com) 译 Andrei Alexandrescu是华盛顿大学计算机科学系的在读研究生,也是《Modern C++ Design》一书的作者。他的邮箱是 andrei

移动开发与培训 272

共享数据结构无锁释放之epoch-based reclame

epoch based reclaim

legend050709的专栏 834

C++多线程-无队列锁

对于编写多线程的朋友来说,队列具有天生的互斥性。在队列里面,一个负责添加数据,一个负责处理数据。谁也不妨碍谁,谁也离不开谁。所以,队列具有天生的并行性。 #define MAX_NUMBER 1000L #define STATUS int #define OK 0 #define FALSE -1 typedef struct _QUEUE_DATA { ...

逍遥云恋 735

无锁编程[2]__一读一写无锁队列,其实就是循环队列,一写多读(基于计数器和更新开关),基于CAS实现:多读多写无锁循环队列

转自:http://blog.163.com/xychenbaihu@yeah/blog/static/13222965520133794137729/

woshikalz的专栏 1586
上一篇: 手工清除USB病毒
下一篇: 无锁数据结构(二)
natureboy520
博客等级 码龄23年 37粉丝 66原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值