超线程能否影响32位处理器上32位int读/写的原子性?

时间:2012-03-15 06:35:58

标签: multithreading atomicity hyperthreading

我已经读过某些地方,超线程可以使32位int(在32位处理器上)读取和写入非原子,即使它是边界对齐的。任何人都可以解释超线程如何影响这个吗?

2 个答案:

答案 0 :(得分:6)

如果这是真的,那将是某种可怕的CPU错误,特定于某个特定模型或步进。 32位读写是原子的,是x86平台属性的基础,是Windows,Linux和许多应用软件所依赖的。

我唯一可以想到的是,这可能是指从没有超线程的单核CPU转变为具有超线程的单物理核CPU。在没有超线程的单核x86 CPU上,即使没有锁定前缀,对对齐的32位变量执行读取 - 修改 - 写入操作的单个指令(例如增量)也是原子的。 (它们不能保证,它们恰好是。)具有超线程的CPU的行为很像具有两个物理内核的CPU,因此读取 - 修改 - 写入操作(除了交换之外的其他操作)不能保证原子性锁定前缀。

现在这是一个无关紧要的区别,因为您的软件将遇到的绝大多数CPU将以这种或那种方式拥有多个核心。因此,除非锁定,否则即使是对齐的32位值的单指令读 - 修改 - 写操作也不会是原子的。 (交换是个例外,因为即使没有前缀它也会被锁定。)

答案 1 :(得分:2)

对齐读或写总是原子的,即使在多CPU系统上也是如此。什么不是原子的(这可能是你所听到的 - 或者至少你应该听到的)是读 - 修改 - 写指令,如增量,或添加内存目标。即使在HT系统上,这些也不是原子的,但即使没有锁定,它们在具有单个逻辑CPU的系统上也是原子的(不是保证,而是偶然)。