原子操作(c++)冻结cpu吗?
does atomic operation (c++) freeze cpu
如果我们在多核cpu上执行原子操作,原子指令会冻结所有其他核上的操作吗?
如果我们对一个原子变量进行自增操作:+ + atomicInteger;这会冻结其他核上的所有其他操作吗?我专注于x86处理器。我知道读写内存对齐的本机类型是原子的,不会影响任何其他内核的执行。
x86允许写入跨两条缓存线(即跨两个64字节块)的未对齐数据,但不能保证结果是原子的。这意味着你可以从地址0x1003c
读取8个字节,例如,需要CPU获取2行(0x10000
和0x10040
),取相关的4字节块并将它们拼接在一起。然而,这两行可以存储在不同的位置——一个可以缓存,另一个可以在主存中。在极端情况下(页面分割),理论上甚至可以换出一个。因此,您可能会从不同的时间获得2个数据块(更好的术语是观察点),其中来自其他进程的存储可能在中间更改了一个。
注。- user3286380提出了一个很好的观点,++atomicInteger
不是原子的,即使你这样声明它。Std::atomic保证原子读和原子写(每个都有自己的观察点),但它不保证原子读-修改-写,除非您显式声明。
原子操作是指不能由多个处理器同时执行的操作。如果你想自动地做一个加法,只有一个线程可以做这个操作。
如果我们在一个多核cpu上执行一个原子操作,原子操作是否执行指令冻结操作的所有其他核心?
。不一定,如果您碰巧有多个线程试图执行相同的原子操作,那么除了第一个到达原子语句的线程外,它们将被停止。
我知道读写内存对齐的本机类型是原子的并且不影响任何其他内核的执行。
你在哪里读到的?我听起来不太对。此操作的结果可能取决于体系结构。但是,如果在x86上有多个线程,并且这些线程试图写入相同的位置,则默认情况下该操作不是原子性的。因此,线程正在编辑的地址的最终值可以是任何值。
这里有一个类似的讨论,你可能会感兴趣:pthreads:如果我从两个不同的线程中增加一个全局变量,会有同步问题吗?相关文章:
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- 在模拟器中使用并集来模拟CPU寄存器有多合适
- WIN32:C++,为什么在WM_CLOSE上调用Messagebox函数程序正在冻结
- 编写一个函数以使用 n 百分比的 CPU 使用率
- 如何禁用 CPU 的无序执行
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- Win32 发送输入鼠标移动滞后并冻结
- ImGui 在单击按钮后冻结
- 分别测量每个线程上花费的 CPU 时间(C++)
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- QWidget UI 在使用 QQuickWidget 时冻结
- 如何防止 std::thread 在 QT 中冻结 GUI?
- 在程序运行时监视 VxWorks 中的任务 CPU 利用率
- Adafruit 羽毛RFM69HCW在使用过程中会冻结,需要硬重置
- MFC/C++ ComboBox:禁用下拉列表关闭和打开(UI 冻结)的绘制
- 对于等待以 std::future wait() 返回的函数的 CPU 使用率或检查标志在循环中休眠一段时间哪个更好?
- 您选择的 CPU 不支持 x86-64 指令集
- Qtcreator 冻结,CPU 使用率为 100%
- Android 冻结在 OpenGL|ES 中(CPU 可能被固定,重试)
- 原子操作(c++)冻结cpu吗?