多线程程序中操作原子性.docVIP

  1. 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
/2010/04/15/atomic-operation-in-multithreaded-application/ 多线程程序中操作的原子性 0. 背景 HYPERLINK /wiki/Atomic_operation \o 原子操作 原子操作 就是不可再分的操作。在多线程程序中原子操作是一个非常重要的概念,它常常用来实现一些同步机制,同时也是一些常见的多线程Bug的源头。本文主要讨论了三个问题:1. 多线程程序中对变量的读写操作是否是原子的?2. 多线程程序中对Bit field(位域)的读写操作是否是线程安全的?3. 程序员该如何使用原子操作? 1. 多线程环境下对变量的读写操作是否是原子的? 我们先从一道很热门的百度笔试题讲起。很多人讲不清楚其背后的原理,我们就对它进行一下剖析(其实这个题目有点歧义,后面我们会讲到): 以下多线程对int型变量x的操作,哪几个需要进行同步:( ) A. x=y; B. x++; C. ++x; D. x=1; 要彻底理解这个问题,我们首先需要从硬件讲起。以常见的X86 CPU来说,根据Intel的 HYPERLINK /design/processor/manuals/253668.pdf \o 参考手册 参考手册 ,它基于以下三种机制保证了多核中加锁的原子操作(8.1节): (1)Guaranteed atomic operations (注:8.1.1节有详细介绍) (2)Bus locking, using the LOCK# signal and the LOCK instruction prefix (3)Cache coherency protocols that ensure that atomic operations can be carried out on cached data structures (cache lock); this mechanism is present in the Pentium 4, Intel Xeon, and P6 family processors 这三个机制相互独立,相辅相承。简单的理解起来就是 (1)一些基本的内存读写操作是本身已经被硬件提供了原子性保证(例如读写单个字节的操作); (2)一些需要保证原子性但是没有被第(1)条机制提供支持的操作(例如read-modify-write)可以通过使用”LOCK#”来锁定总线,从而保证操作的原子性 (3)因为很多内存数据是已经存放在L1/L2 cache中了,对这些数据的原子操作只需要与本地的cache打交道,而不需要与总线打交道,所以CPU就提供了cache coherency机制来保证其它的那些也cache了这些数据的processor能读到必威体育精装版的值(关于cache coherency可以参加我的 HYPERLINK /2010/03/06/why-should-programmer-care-about-sequential-consistency-rather-than-cache-coherence/ \o 一篇博文 一篇博文 )。 那么CPU对哪些(1)中的基本的操作提供了原子性支持呢?根据Intel手册8.1.1节的介绍: 从Intel486 processor开始,以下的基本内存操作是原子的: ? Reading or writing a byte(一个字节的读写) ? Reading or writing a word aligned on a 16-bit boundary(对齐到16位边界的字的读写) ? Reading or writing a doubleword aligned on a 32-bit boundary(对齐到32位边界的双字的读写) 从Pentium processor开始,除了之前支持的原子操作外又新增了以下原子操作: ? Reading or writing a quadword aligned on a 64-bit boundary(对齐到64位边界的四字的读写) ? 16-bit accesses to uncached memory locations that fit within a 32-bit data bus(未缓存且在32位数据总线范围之内的内存地址的访问) 从P6 family processors开始,除了之前支持的原子操作又新增了以下原子操作: ? Unaligned 16-, 32-, and 64-bit accesses to cached memory that fit within a cache line(对单个cache line中缓存地址的未对齐的16/32/64位访问) 那么

文档评论(0)

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

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

版权声明书
用户编号:8000054077000003

1亿VIP精品文档

相关文档