无锁数据结构(基础篇):原子性、原子性原语.pdfVIP

无锁数据结构(基础篇):原子性、原子性原语.pdf

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
无锁数据结构(基础篇):原子性、原子性原语

无锁数据结构 (基础篇):原子性、原子性原语 无锁数据结构基于两方面——原子性操作以及内存访问控制方 。本文中我话题主要涉及原 子性和原子性原语。 在开始之前,我对大家表示感谢,谢谢你们对初识无锁数据结构的热爱。看到大家对无锁话 题很感兴趣,我感到很开心。我计划依据学术概念将此做成一个系列,从基础到算 ,同时以文 本的形式展示 libcds 中的代码实现。但有些读者希望避开漫谈,尽快展示这些代码,以及如何利 用这些库。我同意其中的一些观点。毕竟,不是所有的人既想知晓 boost 内部构造,也想知道如 何应用。 因此,我将系列文章分了三部分:基础篇、机制篇、番外篇,每篇文章涉及其中之一。 在基础篇,我会介绍底层的知识,甚至现代CPU构造。在机制篇,我会介绍无锁领域有趣的 算 和方 ——这一部分更像是无锁数据结构的理论实现。Libcds会是一个无尽的 C++ 代码来源 。在番外篇,大都是关于 libcds 实现实践为主题的文章,编程方 、建议和常见问题;对读者的 提问、评价、提议做出反馈。 本文不会涉及太多 C++ 编程,甚至不会涉及太多无锁知识; (尽管没有原子性,无锁算 难 以实现。)主要是现代处理器的原子性原语实现,利用这些基本类型时可能遇到的问题。 原子性是两种底层概念中的前一种。 原子性操作可以简单地分为读写 (read and w rite )、原子性交换操作 (read-modify- w rite,RMW )两部分。原子操作可认为是一个不可分的操作;要么发生,要么没发生,我们看不 到任何执行的中间过程,不存在部分结果 (partial effects )。简单的读写操作甚至不具有原子性 ,例如,没有内存对齐的数据,该数据的读取不具有原子性。在X86架构的计算机中,这样的读 操作会导致内部回避。这样,处理器读取数据就被分成了好几部分。在其它诸如 parc、Intel Itanium架构中,这样的读操作会导致段错误,这些操作要能被拦截并处理,而原子性操作不存在 这样的问题。在现代处理器中,原子性的读写操作仅仅作用于对齐后的完整类型 (整数和指针) ;而现代编译器是volatile基本类型正确对齐的保障。如果你想4到8个比特大小的数据结构具有原 子性,那你就应该谨慎行事,借助编译器指令确保其正确对齐。每种编译器都有其独一无二的 数据、类型对齐方 。顺便说一下,libcds 库支持一组备用类型和宏指令,当你声明对齐数据时 ,它们会隐藏编译器依赖的部分。 Compare-and-swap 即便竭尽全力,设计一个仅仅使用读写的无锁容器算 依然是困难重重 (我不清楚针对线程 随机数的数据结构)。这就是为什么处理器架构开发人员采用 RMW 操作的原因。RMW可以原子 性地执行对齐内存单元读操作和针对它的写操作:compare-and-swap (CA )、fetch-and-add (FAA)、test-and-set (TA ) 等等。在学术圈,compare-and-swap (CA )被认为是最基本的一种 操作。伪代码如下: 从字面意思上看,如果pAddr地址中的当前变量值等于预期的 nExpected ,那么将 nNew 的 æ´å¤ç²¾å½©æ»ç¥è®¿é® 1 值赋给此变量,并返回true ;否则返回false,变量值不变。所有执行过程都是原子性的、不可 分的,不会产生任何可见的部分结果。借助于CA ,其它的 RMW 操作都可以估值。如下的 fetch-and-add 是这样的: CA 操作的学术性类型在实践中并非那么得心应手。CA 失败后,我们时常想知道内存单元 中的当前值是多少。这时可以考虑另一个种CA (所谓的 valued CA ,依然是原子性执行): C++11中的 compare_exchange函数包含了两种衍生类型 (严格地说,C++11没有此类函数 ,它们是 ompare_exchange_strong 和 compare_exchange_weak,这些我稍后会告知大家): 参数nExpected通过引用传值,并且包含pAddr地址的预期变量值。在输出端,返回变化之前 的值。(译者注,其实就是

文档评论(0)

yan698698 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档