在 x86-64 CPU(Intel 或 AMD)上,将 4/8 字节写入 32/64 位对齐地址的“movnti”指令是原子的吗?
最佳答案
是的,movnti
在自然对齐的地址上是原子的,just like all other naturally-aligned 8/16/32/64b stores (and loads) on x86 .这适用于任何内存类型(写回、写组合、不可缓存等)。请参阅该链接以了解英特尔 x86 手册中保证的措辞。
请注意,原子性与内存排序是分开的。正常的 x86 商店是 release-store操作,但 movnt 商店“放松”。
有趣的事实:32 位代码可以使用 x87 (fild
/fistp
) 或 SSE/MMX movq
来执行原子 64 位加载/存储。 gcc 的 std::atomic
实现实际上就是这样做的。只有大于 8B 的 SSE 访问(例如 movaps
或 movntps
16B/32B/64B 向量存储)不保证是原子的。 (即使 16B 操作在某些硬件上也是原子操作,但没有标准方法来检测这一点)。
关于x86-64 - 在 x86-64 上, "movnti"指令是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18604041/