整个讨论的关键是正确的对齐,这是在 xxx 的 Partition I 中的“”部分中定义12.6.2 Alignment
的:
Built-in datatypes shall be properly aligned, which is defined as follows:
• 1-byte, 2-byte, and 4-byte data is properly aligned when it is stored at
a 1-byte, 2-byte, or 4-byte boundary, respectively.
• 8-byte data is properly aligned when it is stored on the same boundary
required by the underlying hardware for atomic access to a native int.
基本上,所有 32 位值都具有所需的对齐方式,而在 64 位平台上,64 位值也具有所需的对齐方式。
但请注意:有一些属性可以显式更改内存中类的布局,这可能会导致您失去这种对齐方式。这些是专门用于此目的的属性,因此除非您已着手更改布局,否则这不适用于您。
除此之外,该类的目的Interlocked
是提供(解释)只能在“之前”或“之后”状态下观察到的操作。联锁操作通常只在修改内存时才需要考虑(通常以一些非平凡的比较交换类型的方式)。正如您找到的 MSDN 文章所指出的,读取操作(正确对齐时)在任何时候都可以被视为原子操作,无需进一步的预防措施。
然而,在处理读取操作时还有其他注意事项:
- 在现代 CPU 上,虽然读取可能是原子的,但它也可能从某处过时的缓存中返回错误的值......这是您可能需要使字段“易失”以获得您期望的行为的地方
- 如果您在 32 位硬件上处理 64 位值,您可能需要使用该
Interlocked.Read
操作来保证在单个原子操作中读取整个64 位值(否则可能会作为 2 个单独的 32 位可以从内存更新的任一侧读取)
- 重新排序读取/写入可能会导致您无法获得预期的值;在这种情况下,可能需要一些内存屏障(显式或通过使用
Interlocked
类操作)
简短摘要;就原子性而言,您正在做的事情很可能不需要任何特殊的阅读指令……但是,您可能需要注意其他事情,具体取决于您在做什么。