关于InterlockedIncrement函数的返回值

关于InterlockedIncrement函数的返回值

作者:BlogUpdater |  时间:2021-02-20 |  浏览:363 |  评论已关闭 条评论

蝎子
如果你仔细看看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?》

评论已关闭。