原子操作(c++)冻结cpu吗?

does atomic operation (c++) freeze cpu

本文关键字:cpu 冻结 c++ 原子操作      更新时间:2023-10-16

如果我们在多核cpu上执行原子操作,原子指令会冻结所有其他核上的操作吗?

如果我们对一个原子变量进行自增操作:+ + atomicInteger;这会冻结其他核上的所有其他操作吗?我专注于x86处理器。

我知道读写内存对齐的本机类型是原子的,不会影响任何其他内核的执行。

x86允许写入跨两条缓存线(即跨两个64字节块)的未对齐数据,但不能保证结果是原子的。这意味着你可以从地址0x1003c读取8个字节,例如,需要CPU获取2行(0x100000x10040),取相关的4字节块并将它们拼接在一起。然而,这两行可以存储在不同的位置——一个可以缓存,另一个可以在主存中。在极端情况下(页面分割),理论上甚至可以换出一个。因此,您可能会从不同的时间获得2个数据块(更好的术语是观察点),其中来自其他进程的存储可能在中间更改了一个。

另一方面,一旦添加了锁前缀(或者添加了std::原子定义,它应该包含这个),x86就会保证结果来自单个观察点,并且与来自所有其他线程的观察结果一致。为了实现这一点,CPU很可能会强制执行所有核心的完整块(例如总线锁),直到两条线都在请求核心中得到保护。如果你不这样做,你就会冒着陷入僵局的风险,你总是得到一条线,当你得到第二条线时,它就会被另一个核心夺走。

注。- user3286380提出了一个很好的观点,++atomicInteger不是原子的,即使你这样声明它。Std::atomic保证原子读和原子写(每个都有自己的观察点),但它不保证原子读-修改-写,除非您显式声明。

原子操作是指不能由多个处理器同时执行的操作。如果你想自动地做一个加法,只有一个线程可以做这个操作。

如果我们在一个多核cpu上执行一个原子操作,原子操作是否执行指令冻结操作的所有其他核心?

。不一定,如果您碰巧有多个线程试图执行相同的原子操作,那么除了第一个到达原子语句的线程外,它们将被停止。

我知道读写内存对齐的本机类型是原子的并且不影响任何其他内核的执行。

你在哪里读到的?我听起来不太对。此操作的结果可能取决于体系结构。但是,如果在x86上有多个线程,并且这些线程试图写入相同的位置,则默认情况下该操作不是原子性的。因此,线程正在编辑的地址的最终值可以是任何值。

这里有一个类似的讨论,你可能会感兴趣:pthreads:如果我从两个不同的线程中增加一个全局变量,会有同步问题吗?