首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

关于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?》

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20210220A04ZEY00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券