Interlocked系列函数可以对内存进行原子操作,它是如何实现的?
    它的实现依赖于底层的CPU架构。对于某些CPU来说,这很简单,例如x86可以通过LOCK前缀直接支持Interlocked操作(有一个额外的特性就是XCHG指令总是隐式包含了LOCK前缀)。IA64和x64也直接支持原子的load-modify-store操作。
    其它的多数CPU架构把这个操作分成两部分,被称为Load-link/store-conditional。第一部分(load-link)从指定内存地址读取一个值,并且处理器会监视这个内存地址,看是否有其它处理器修改该值。第二部分(store-conditional)是如果这期间没有其它处理器修改该值,则将新值存回该地址。因此,一个原子的load-link/store-conditional操作就是通过load-link读取值,进行一些计算,然后试图store-conditional。如果store-conditional失败,那么重新开始整个操作。
 LONG InterlockedIncrement( LONG volatile *value )
{
LONG lOriginal, lNewValue;
do
{
//
//通过load-link读取当前值
//可以知道写回之前是否有人修改它
//
lOriginal = load_link(value); //
//计算新的值
//
lNewValue = lOriginal + ; //
//有条件的写回新值
//如果有人在计算期间覆写该值,则函数返回失败
//
} while ( !store_conditional(value, lNewValue));
return lNewValue;
}
(如果看起来有些熟悉,是的,你之前见到过这种模式。)
    请求CPU监视一个内存地址依赖于CPU自己的实现。但要记住一件事情,CPU在同一时间只能监视一个内存地址,并且这个时间是很短暂的。如果你的代码被抢占了或者在load-link后有一个硬件中断到来,那么你的store-conditional将会失败,因为CPU因为硬件中断而分心了,完全忘记了你要求它监视的内存地址(即使CPU成功的记住了它,也不会记太久,因为硬件中断几乎都会执行自己的load-link指令,因此会替换成它自己要求监视的内存地址)。
    另外,CPU可能会有点懒,在监视时并不监视内存地址,而是监视cache line,如果有人修改了一个不同的内存位置,但是刚好跟要被监视的内存地址在同一个cache line里,store-conditional操作也会失败,即使它事实上可以成功完成。ARM架构的CPU是太懒了,以至于任何向同一块2048字节写入的操作都会导致store-conditional失败。
    这对于需要用汇编语言来实现Interlocked操作的你来说意味着什么?你需要尽可能减少load-link和store-conditional之间的指令数。例如,InterlockedIncrement只不过是给值加1。你在load-link和store-conditional之间插入的指令越多,store-conditional失败的可能就越大,你就不得不重来一次。如果你在两者之间插入的指令太多了就会导致store-conditional永远不会成功。举一个极端的例子,如果你计算新值的代码需要耗时5秒,在这5秒内肯定会接收到很多硬件中断,store-conditional操作就永远都会失败。
 
本文译自The Old New Thing,原文地址http://blogs.msdn.com/b/oldnewthing/archive/2013/09/13/10448736.aspx

【翻译】InterlockedIncrement内部是如何实现的?的更多相关文章

  1. 【翻译】内部API的价值

    内部api的设计,主要是为了简化软件的开发,简化系统和操作过程.目前绝大多数用例是这样的. 内部api经常被忽略,因为它们是针对内部开发人员的.这种类型的api通常使用于特定公司及其部门的专用数据.尽 ...

  2. 深入浅出HTTP协议(WEB开发和面试必备)

    1. 基础概念篇   a.简介 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(World Wide Web Consortium)和 ...

  3. HTTP协议详解(转)

    转自:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx Author :Jeffrey 引言 HTTP是一个属于应用层的面向对象的 ...

  4. HTTP协议详解

    Author :Jeffrey 引言 HTTP 是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和 扩展. ...

  5. 深入理解http/https协议

    深入理解HTTP协议(转) http协议学习系列 1. 基础概念篇 1.1 介绍 HTTP是Hyper Text Transfer Protocol(超文本传输协议)的缩写.它的发展是万维网协会(Wo ...

  6. ASP.NET知识总结(3.HTTP协议详解)

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  7. 接口测试之HTTP协议详解

    引言 HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1. ...

  8. HTTP协议(转)

    HTTP是一个属于应用层的面向对象的协议,由于其简捷.快速的方式,适用于分布式超媒体信息系统.它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展.目前在WWW中使用的是HTTP/1.0的第 ...

  9. Http协议与TCP协议简单理解

    TCP协议对应于传输层,而HTTP协议对应于应用层,从本质上来说,二者没有可比性.Http协议是建立在TCP协议基础之上的,当浏览器需要从服务器获取网页数据的时候,会发出一次Http请求.Http会通 ...

随机推荐

  1. jenkins升级为2.134

    由于前面装的jenkins版本为2.130版本,昨天(2018.7.26)发现了两个jenkins的漏洞,影响范围为:Jenkins weekly 2.132 以及更早的版本.Jenkins LTS ...

  2. Codeforces Round #504 (rated, Div. 1 + Div. 2, based on VK Cup 2018 Final) E. Down or Right

    从(1,1,n,n)每次只变一个坐标,进行询问. 如果问到对角线有距离限制, 再从(1,1,n/2,n/2)询问到(n/2,n/2,n,n) 记住前半部分贪心忘上走,后本部分贪心往右走 因为最后的路线 ...

  3. Android 8.0 NavigationBar 颜色问题。

    1. packages/SystemUI/src/com/android/systemui/statusbar/phone/LightBarController.java public void on ...

  4. Java跨平台的实现原理

    不同操作系统支持的指令集有所差异,只要在不同操作系统上安装对应的jvm,jvm负责把Java字节码翻译成对应机器的二进制码,从而实现java语言的跨平台.

  5. JavaScript 高级之面向对象

    1. 对象属性及方法 创建对象的方式 <script> //创建对象的方式一 var obj = {}; //创建对象的方式一 var obj = new Object(); </s ...

  6. c++ Dynamic Memory (part 1)

    1. make_shared<T>(args): return a shared_ptr dynamically allocated object of type T. Use args ...

  7. 王者荣耀交流协会第一次scrum会议

    照片: 拍照的人是我(高远博),没有出镜.开会时间是17:00到17:37. 昨天的成绩: (1)优化了折线图界面 今天的计划: (1)小组成员汇报昨日成果. (2)小组成员继续推进任务. 遇到的困难 ...

  8. 下载与安装APache Cordova

    最近老师留了写网页版或手机版程序,但先前没有好好听javaweb,而今年又没选Android移动应用开发.所以去图书馆借了一本书是关于HTML5+CSS3+jQueryMobile的. 这几天配置了打 ...

  9. 软工 · 第十一次作业 - Alpha 事后诸葛亮(团队)

    软工 · 第十一次作业 - Alpha 事后诸葛亮(团队) 组长本次作业链接 现代软件工程 项目Postmortem 设想和目标 1.我们的软件要解决什么问题?是否定义得很清楚?是否对典型用户和典型场 ...

  10. KMP---POJ 3461 Oulipo

    Description The French author Georges Perec (1936–1982) once wrote a book, La disparition, without t ...