关于InterlockedIncrement函数的返回值
蝎子
如果你仔细看看InterlockedIncrement和InterlockedDecrement函数描述文档,你会看到:在Windows NT 3.51和更早版本以及Windows 95上,返回值是函数执行结果的一个标志而已。
这是为什么?
80386指令集支持互锁的增量和减量操作,但是增量/减量操作的实际结果不会返回。该操作仅更新标志。结果,从CPU获得的关于操作结果的唯一信息是它是零,正还是负。 (好吧,你还会得到一些晦涩的信息,例如结果中是否存在偶数或奇数个1位,但这在今天已经不那么有用了。)
由于这些操作系统需要支持80386处理器,因此InterlockedIncrement和InterlockedDecrement函数的实现是受处理器功能的限制。80486引入了XADD指令,该指令返回操作数的原始值。利用这些附加信息,现在可以精确返回操作结果。
Windows NT 4放弃了对80386处理器的支持,因此至少需要80486它才可以利用此指令。
Windows 98仍必须支持80386,因此也是不能返回实际值。那么Windows 98是如何设法实现CPU不支持的操作的呢?
Windows 98检测到CPU是否有支持新XADD指令。如果不是,那么它使用了一种令人难以置信的缓慢机制:每当你想增加或减少变量时,它都会调用驱动程序。然后,驱动程序将通过禁用中断并在锁定的内存中执行操作来模拟XADD指令。
由于Windows 98是单处理器操作系统,因此不必担心第二个处理器同时更改内存。它需要确保的是,单个处理器在执行”原子”操作时不会被中断。
总结
实现一个处理器不支持的特性,是真的难。
最后
Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一,里面有很多关于Windows的小知识,对于广大Windows平台开发者来说,确实十分有帮助。
本文来自:《Why did InterlockedIncrement/Decrement only return the sign of the result?》
相关文章
- 数组比较返回差集封装的函数
- 关于FindWindow函数「建议收藏」
- 【说站】python函数定义的规则
- 面向函数编程:关于函数式组件、dialog的api化
- 那么多关于RANKX函数排名的方法,竟然都是错的!| DAX大坑
- 只有一个光秃秃的函数是怎么回事?关于(x)的又一种简化写法 | PQ重难点突破
- 关于虚函数的学习思考
- 关于CHOOSE函数的使用
- 抽丝剥茧C语言(高阶)字符函数和字符串函数+练习
- 深度学习基础5:交叉熵损失函数、MSE、CTC损失适用于字识别语音等序列问题、Balanced L1 Loss适用于目标检测
- MySQL中DATE_FORMAT()函数将Date转为字符串
- Oracle关于处理小数点位数的几个函数,取小数位数,Oracle查询函数详解数据库
- 函数理解Linux atoi函数(linuxatoi)
- 函数解析Linux atoi函数的作用(linuxatoi)
- Oracle中使用Substr函数截取指定字符(oracle截取指定字符)
- 利用Oracle聚合函数拓展数据分析的可能性(oracle关于聚合函数)
- MySQL中rank函数轻松实现数据排名(mysql中rank函数)
- Oracle使用MD5函数安全性加强(md5函数 oracle)
- 关于javascript函数的几个话题
- php数组函数序列之array_values()获取数组元素值的函数与方法
- js函数的引用,关于内存的开销
- 关于PHP的相似度计算函数:levenshtein的使用介绍
- 关于php接口问题(php接口主要也就是运用curl,curl函数)
- 关于jquery中全局函数each使用介绍
- php的sprintf函数的用法控制浮点数格式