多核架构的多线程

Ton*_*ion 4 c++ windows multithreading multicore

当你遇到线程A读取一些全局变量并且线程B写入同一个变量的情况时,现在除非读/写在单个内核上不是原子的,否则你可以在没有同步的情况下执行它,但是当在多个上运行时会发生什么情况.核心机器?

pax*_*blo 9

即使在单个核心上,也不能假设操作是原子的.这可能是你在汇编程序中编码的情况,但是,如果按照你的问题用C++进行编码,你就不知道它将编译成什么.

您应该依赖于您编码的抽象级别的同步原语.在你的情况下,这是线程调用C++.它们是pthreads,Windows线程还是其他东西.

这与我在另一个答案中给出的相同的推理是否i ++是线程安全的.最重要的是,您不知道,因为您没有编码到那个级别(如果您正在使用内联汇编程序和/或您理解并且可以控制在幕后发生的事情,那么您将不再编码C++级别,你可以忽略我的建议).

操作系统和/或操作系统类型的库对它们运行的​​环境有很多了解,远远超过C++编译器.使用适当的同步原语将为您节省大量的焦虑.

  • +1,非常好点.请注意,当您在不同的抽象级别进行编码时,可能会发生非常奇怪的事情.编译器甚至可能会首先决定您不想将该变量写入内存! - 它可以将它缓存在寄存器中,并且永远不会生成将变量写回主存储器的指令,其他线程可以看到它. (2认同)

Ama*_*9MF 7

它将具有与单核相同的缺陷,但由于必须在核之间进行L1高速缓存同步而具有额外的延迟.

注意 - "你可以在不同步的情况下完成"并不总是一个真实的陈述.

  • +1表示即使使用单核机器也不安全. (2认同)

jal*_*alf 5

即使在单一机器上,也绝对不能保证在没有明确同步的情况下这将工作.

有几个原因:

  • 操作系统可以随时中断线程(在任意两条指令之间),然后运行另一个线程,并且
  • 如果没有明确的同步,编译器可能会非常自由地重新排序指令,破坏您认为的任何保证,并且
  • 甚至CPU也可以这样做,即时重新排序指令.

如果要在两个线程之间进行正确的通信,则需要某种同步.总是,没有例外.

该同步可以是OS或线程API提供的互斥锁,也可以是CPU特定的原子指令,或者只是普通的内存屏障.