我在某处读取超线程可以使32位int(在32位处理器上)即使是边界对齐的情况下也读写非原子。任何人都可以解释如何过度影响吗?

有帮助吗?

解决方案

如果是真的,那将是一个特定模型或踩踏的某种可怕的CPU错误。 32位读取和写入是原子的,是X86平台的属性的基础,由Windows,Linux和批次和大量应用软件依赖。

我唯一可以考虑这可能已经指的是从单核CPU转换到没有超线程到具有超线程的单物理核心CPU的转换。在没有超线程的单核X86 CPU上,即使没有锁定前缀,对对齐的32位变量进行读取修改写操作的单个指令(例如增量)也是原子的。 (它们不保证,他们刚刚碰巧。)带有超线程的CPU与具有两个物理核心的CPU相同的CPU行为,因此读取修改写入操作(其他交换机)无法保证原子锁定前缀。

现在是一个无关的区别,因为从大部分CPU,你的软件将遇到一个以上或另一个方式的核心。否则甚至单指令读取修改写入操作才能对齐的32位值,除非锁定,否则不会是原子的。 (交换是例外,因为它即使没有前缀也被锁定。)

其他提示

对齐读取或写入始终是原子的,即使在多CPU系统上也是如此。什么不是原子(这可能是您所听到的 - 或者至少在您所听到的内容中)是读写的写字,如递增,或者添加内存目标。即使在HT系统上也不是原子的,但即使在没有锁定的情况下,它们也是具有单个逻辑CPU的系统的原子(而不是保证)。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top