共享数据的非互锁访问


如果你要提取一个对齐的数据,那么调用任何一个 InterlockedXxx 函数就可以正确地做到。支持 NT的CPU必然保证你能获得一个首尾一致的值,即使互锁操作发生在数据被提取前后的短暂时间内。然而,如果数据没有对齐,当前的互锁访问也会禁止其它的互锁访问,不至于造成并发访问而取到不一致的值。
想象一下,如果有一个整数,其大小跨过了物理内存中的缓冲边界,此时,CPU A想提取这个整数,而CPU B在同一时间要在这个值上执行一个互锁加1 操作。那么即将发生的一系列事情可能是:(a) CPU A 提取了含有该值高位部分的缓冲线,(b) CPU B 执行了一个互锁增1 操作并向该值高位部分产生了一个进位,(c) CPU A 接着提取了包含该值低位部分的缓冲线。确保这个值不跨过一个缓冲界限可以避免这个问题,但最容易的解决办法是确保该值按其数据类型的自然边界对齐,如ULONG 类型按4 字节对齐。

书上看到这么一段话,求解释下例子!缓冲线和高位低位的位置?

驱动 windows

卡多卡瓦手电筒 11 years, 11 months ago

Your Answer