delphi与api中的加一减一函数
用于增减变量的并不是常用的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中的加一减一函数相关推荐
- c语言浮点型自变量能自加自减,C语言中自加++自减--运算的数据类型可以是Float和Double么?...
自加++自减--运算的数据类型可以是Float和Double. 在c语言中,并不是所有变量都可以使用自增自减操作符:可以使用自增自减操作符的数据类型有:int.float.double .char.l ...
- c语言 字符相加_C语言中自加自减的编译原理
自增自减规则 i++ 与 ++i 的主要区别有两个: 1. i++ 返回原来的值,++i 返回加1后的值. 2. i++ 不能作为左值,而++i 可以. 毫无疑问大家都知道第一点(不清楚的看下下面的实 ...
- Android API中被忽略的几个函数接口
1. MotionEvent的几个函数 下面的方法都支持多点触摸,即可以对单个触摸点调用下面的方法 1.1 getPressure() 这个api 可以获取到手指触摸屏幕时候的压力,但是需要硬件和驱动 ...
- sha256加密_python中使用加盐哈希函数加密密码
开发网站离不开用户的注册与登录,今天来说说在网站开发的时候关于用户密码的保存方式,传统的方式有以下几种 - 明文存储:肉眼就可以识别,没有任何安全性. 谁用谁傻缺 - 加密存储:通过一定的变换形式,使 ...
- date月份加一_delphi 年月日自动加一减一函数,月加一,月减一
月份减一月情况: function GetLastMonth(ADate : TDateTime) : TDateTime; var dwYear, dwMonth, dwDay : Word; be ...
- linux下的shell运算(加、减、乘、除)
关注微信公众号"虾米聊吧" 获取所有资料干货,每天更新技术干货,一起交流一起学习~ ((i=$j+$k)) 等价于 i=`expr $j + $k` ((i=$j-$k)) ...
- C语言自加自减运算符(++i / i++) - C语言零基础入门教程
目录 一.C 语言自加++ / 自减 – 运算符简介 1.前 ++ 后 ++ 的区别 2.前–后-- 的区别 二.C 语言自加++/自减–运算符实战 三.猜你喜欢 零基础 C/C++ 学习路线推荐 : ...
- Linux 减,linux下的shell运算(加、减、乘、除)
linux下的shell运算(加.减.乘.除) 标签: linuxshell运算加减乘除 2014-03-12 16:25 15127人阅读 评论(0) 收藏 举报 分类: linux(17) ((i ...
- c语言中字符减减自符意思,C语言中的自加自减运算
[摘 要]C语言中运算符十分丰富,自加运算和自减运算是c语言的教学中的重点和难点,但我们只要在教学中抓住运算的基本定义,通过经典题型分析和适度深入解析,就不难达到熟练应用之目的. [关键词]运算的定义 ...
最新文章
- ZooKeeper简单使用
- Intel Realsense C/C++ 转 python rs-align 使用深度颜色映射介绍空间流对齐的概念(转不起来,缺少信息)
- 常用3种数据库的Sql分页
- (转)解决fasterxml中string字符串转对象json格式错误问题(无引号 单引号问题)...
- 10个Linux 系统性能监控命令行工具
- nginx定制header返回信息模块ngx_headers_more
- 位运算java_Java中的位运算
- 设计模式(3)策略模式
- sql文件转成json格式_10秒就能将任意格式的文件转成PDF,简单易操作,不学可别后悔...
- 让webstorm支持avalon语法自动补全
- 算法手记 之 数据结构(并查集详解)(POJ1703)
- 代码比对工具-Diffmerge
- 域用户创建和计算机加入域
- lgv20刷twrp_LG V30+ 日版 L-01K 刷机解锁BL 刷入TWR 回复日版基带
- 【Unity】那些你不得不用的好插件!
- YYKit - YYModel 使用方法
- 【PYTHON数据分析实战】电影票房数据分析(一)数据采集
- 删除.sys、.dll流氓文件
- 好文章也是要色香味俱全的!——CVPR2010最有趣文章
- Elasticsearch:验证 Elasticsearch Docker 镜像并安装 Elasticsearch