Multithreading 多线程意义下的机器指令设想

Multithreading 多线程意义下的机器指令设想,multithreading,language-agnostic,synchronization,nonblocking,Multithreading,Language Agnostic,Synchronization,Nonblocking,我可以假设每条指令都是原子性的吗?比如说, mov dword ptr [eax], 0 移动成功或未发生。在执行的指令中间没有中断。< /P> 我的假设正确吗 我知道当前的处理器可以无序执行指令,而编译器会在优化方面生成无序的代码。因此,这个动作的执行顺序和我写的不一样。但这并不重要,我关心的是,一旦执行单个指令,它就不能被中断 编辑: 我关心的是任何单个指令的原子性,而不是特殊指令或读写指令的分支,我只是使用mov作为例子 处理器的任何核心执行指令(add、mov、shift等)的任何时候

我可以假设每条指令都是原子性的吗?比如说,

mov dword ptr [eax], 0
移动成功或未发生。在执行的指令中间没有中断。< /P> 我的假设正确吗

我知道当前的处理器可以无序执行指令,而编译器会在优化方面生成无序的代码。因此,这个动作的执行顺序和我写的不一样。但这并不重要,我关心的是,一旦执行单个指令,它就不能被中断

编辑
我关心的是任何单个指令的原子性,而不是特殊指令或读写指令的分支,我只是使用mov作为例子

  • 处理器的任何核心执行指令(add、mov、shift等)的任何时候, 执行会被打断吗
  • 寄存器或内存中是否存在任何不确定状态(机器字大小

  • 或者硬件能够提供原子性的最小单元是什么

    >你已经标记了这个问题C和C++,但是语言都没有<代码> MOV 指令或任何个别指令的概念。如果您的问题是关于x86汇编的,那么yes
    mov
    指令是原子指令,至少只要内存操作数对齐,甚至可能不对齐。但是注意这与C或C++变量的分配是否为原子无关。

    不。一般不应该假定指令是原子的。关于用常量加载寄存器,这有什么关系?您是否在询问寄存器是否会以不确定状态结束?答案是否定的,否则中断将不起作用。从运行在同一内核上的程序的角度来看,寄存器要么加载,要么不加载

    x86中的锁前缀用于确保原子性

    编辑:问题已被编辑以显示将常数存储到内存中。 我的答案仍然是否定的。在某些情况下,如果内存对齐,CPU保证这将是原子的,但我不会依赖它,因为它可能会给你带来麻烦

    另请参见此处:

    你的问题毫无意义;如果
    K
    是常数(立即数),则除实际程序文本外,不涉及内存。(我希望您没有试图解释在SMP/线程存在的情况下自修改代码的行为…)因此,其他线程甚至无法看到这些指令或受到这些指令的影响…“每个指令都是原子性的”->而不是英语。你可以说“是原子观测的”或“是原子观测的”。它们是不同的,跨缓存线边界存储值的MOV指令不是原子指令。字符串移动(MOV)也是如此,它们被设计为可中断/重启。所以一般来说,MOV指令不是原子指令(更不用说更复杂的指令了)。MOV指令是原子指令的特殊情况有:具体地说,加载/存储的操作数是在与操作数大小相等的边界上访问的,对于字大小及以上的项。另外,您最好使用同步指令。奇怪的是,XCHG是原子的,因为Intel早在早期的CPU中就这样做了。@Ira:我已经将我的答案限制为“至少只要内存操作数对齐”,这就避免了跨越缓存线边界。@Ira Baxter说到缓存线,我有点困惑,如何跨越机器字大小的整数缓存线边界?@Chang:将字存储在与缓存线的最后一个字节相对应的地址。@Ira Baxter,我可以断定对齐的地址不会受到缓存线的影响,因此它是原子的,正如R。。写在上面,可以吗?我又更新了问题。那么你的意思是单个指令会被中断吗?实际上,我在问对齐内存是否会以不确定状态结束。在x86上,当应用于“普通”内存中的对齐内存操作数时,普通加载和存储(
    MOV
    指令)是原子的。对于除
    XCHG
    和带有
    LOCK
    前缀的指令之外的任何其他指令,最好假定它不是原子指令。在非x86平台上,即使是普通加载和存储也不一定是原子的。请参阅我关于
    INC
    的非原子性的文章: