用于增减变量的并不是常用的Inc/Dec过程,而是用了InterlockedIncrement/InterlockedDecrement这一对过程,它们实现的功能完全一样,都是对变量加一或减一。但它们有一个最大的区别,那就是InterlockedIncrement/InterlockedDecrement是线程安全的。即它们在多线程下能保证执行结果正确,而Inc/Dec不能。或者按操作系统理论中的术语来说,这是一对“原语”操作。

以加一为例来说明二者实现细节上的不同:

一般来说,对内存数据加一的操作分解以后有三个步骤:

1、 从内存中读出数据

2、 数据加一

3、 存入内存

现在假设在一个两个线程的应用中用Inc进行加一操作可能出现的一种情况:

1、 线程A从内存中读出数据(假设为3)

2、 线程B从内存中读出数据(也是3)

3、 线程A对数据加一(现在是4)

4、 线程B对数据加一(现在也是4)

5、 线程A将数据存入内存(现在内存中的数据是4)

6、 线程B也将数据存入内存(现在内存中的数据还是4,但两个线程都对它加了一,应该是5才对,所以这里出现了错误的结果)

而用InterlockIncrement过程则没有这个问题,因为所谓“原语”是一种不可中断的操作,即操作系统能保证在一个“原语”执行完毕前不会进行线程切换。所以在上面那个例子中,只有当线程A执行完将数据存入内存后,线程B才可以开始从中取数并进行加一操作,这样就保证了即使是在多线程情况下,结果也一定会是正确的。

delphi与api中的加一减一函数相关推荐

  1. c语言浮点型自变量能自加自减,C语言中自加++自减--运算的数据类型可以是Float和Double么?...

    自加++自减--运算的数据类型可以是Float和Double. 在c语言中,并不是所有变量都可以使用自增自减操作符:可以使用自增自减操作符的数据类型有:int.float.double .char.l ...

  2. c语言 字符相加_C语言中自加自减的编译原理

    自增自减规则 i++ 与 ++i 的主要区别有两个: 1. i++ 返回原来的值,++i 返回加1后的值. 2. i++ 不能作为左值,而++i 可以. 毫无疑问大家都知道第一点(不清楚的看下下面的实 ...

  3. Android API中被忽略的几个函数接口

    1. MotionEvent的几个函数 下面的方法都支持多点触摸,即可以对单个触摸点调用下面的方法 1.1 getPressure() 这个api 可以获取到手指触摸屏幕时候的压力,但是需要硬件和驱动 ...

  4. sha256加密_python中使用加盐哈希函数加密密码

    开发网站离不开用户的注册与登录,今天来说说在网站开发的时候关于用户密码的保存方式,传统的方式有以下几种 - 明文存储:肉眼就可以识别,没有任何安全性. 谁用谁傻缺 - 加密存储:通过一定的变换形式,使 ...

  5. date月份加一_delphi 年月日自动加一减一函数,月加一,月减一

    月份减一月情况: function GetLastMonth(ADate : TDateTime) : TDateTime; var dwYear, dwMonth, dwDay : Word; be ...

  6. linux下的shell运算(加、减、乘、除)

    关注微信公众号"虾米聊吧" 获取所有资料干货,每天更新技术干货,一起交流一起学习~ ((i=$j+$k))    等价于 i=`expr $j + $k` ((i=$j-$k))  ...

  7. C语言自加自减运算符(++i / i++) - C语言零基础入门教程

    目录 一.C 语言自加++ / 自减 – 运算符简介 1.前 ++ 后 ++ 的区别 2.前–后-- 的区别 二.C 语言自加++/自减–运算符实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...

  8. Linux 减,linux下的shell运算(加、减、乘、除)

    linux下的shell运算(加.减.乘.除) 标签: linuxshell运算加减乘除 2014-03-12 16:25 15127人阅读 评论(0) 收藏 举报 分类: linux(17) ((i ...

  9. c语言中字符减减自符意思,C语言中的自加自减运算

    [摘 要]C语言中运算符十分丰富,自加运算和自减运算是c语言的教学中的重点和难点,但我们只要在教学中抓住运算的基本定义,通过经典题型分析和适度深入解析,就不难达到熟练应用之目的. [关键词]运算的定义 ...

最新文章

  1. ZooKeeper简单使用
  2. Intel Realsense C/C++ 转 python rs-align 使用深度颜色映射介绍空间流对齐的概念(转不起来,缺少信息)
  3. 常用3种数据库的Sql分页
  4. (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)...
  5. 10个Linux 系统性能监控命令行工具
  6. nginx定制header返回信息模块ngx_headers_more
  7. 位运算java_Java中的位运算
  8. 设计模式(3)策略模式
  9. sql文件转成json格式_10秒就能将任意格式的文件转成PDF,简单易操作,不学可别后悔...
  10. 让webstorm支持avalon语法自动补全
  11. 算法手记 之 数据结构(并查集详解)(POJ1703)
  12. 代码比对工具-Diffmerge
  13. 域用户创建和计算机加入域
  14. lgv20刷twrp_LG V30+ 日版 L-01K 刷机解锁BL 刷入TWR 回复日版基带
  15. 【Unity】那些你不得不用的好插件!
  16. YYKit - YYModel 使用方法
  17. 【PYTHON数据分析实战】电影票房数据分析(一)数据采集
  18. 删除.sys、.dll流氓文件
  19. 好文章也是要色香味俱全的!——CVPR2010最有趣文章
  20. Elasticsearch:验证 Elasticsearch Docker 镜像并安装 Elasticsearch

热门文章

  1. Spark-1.4.0集群搭建
  2. Android生成缩略图-使用Android 2.2新特性完成
  3. hdu 1532(最大流)
  4. poj 2503(字符串hash)
  5. python之sys模块详解
  6. 数据库的两种引擎Innodb和MyIASM
  7. cas sso单点登录 登录过程和登出过程原理说明
  8. 何时使用hadoop fs、hadoop dfs与hdfs dfs命令
  9. 百度2011招聘笔试题+答案解析
  10. BlogEngine(4)---Widget小部件