我在某处读到超线程可以使 32 位 int(在 32 位处理器上)读取和写入非原子,即使它是边界对齐的。谁能解释超线程如何影响这一点?
问问题
784 次
2 回答
6
如果这是真的,那将是某种特定于特定模型或步进的可怕 CPU 错误。32 位读写是原子的,这是 x86 平台属性的基础,Windows、Linux 和大量应用软件都依赖于它。
我唯一能想到的可能是指从没有超线程的单核 CPU 过渡到具有超线程的单物理核 CPU。在没有超线程的单核 x86 CPU 上,即使没有锁定前缀,对对齐的 32 位变量执行读-修改-写操作的单个指令(例如增量)也是原子的。(它们不能保证是,它们只是碰巧是。)具有超线程的 CPU 的行为很像具有两个物理内核的 CPU,因此如果没有锁定前缀。
现在这是一个无关紧要的区别,因为您的软件将遇到的绝大多数 CPU 都会以一种或另一种方式拥有多个内核。因此,即使是对对齐的 32 位值的单指令读-修改-写操作也不会是原子的,除非被锁定。(Exchange 是个例外,因为即使没有前缀,它也会被锁定。)
于 2012-03-15T06:49:11.163 回答
2
对齐读取或写入始终是原子的,即使在多 CPU 系统上也是如此。不是原子的(这可能是你听到的——或者至少你应该听到的)是读-修改-写指令,比如增量,或者与内存目标相加。即使在 HT 系统上,它们也不是原子的,但即使在没有锁定的情况下,它们在具有单个逻辑 CPU 的系统上也是原子的(不是保证,而是偶然)。
于 2012-03-15T06:52:22.467 回答