在 x86-64 CPU(Intel 或 AMD)上,将 4/8 字节写入 32/64 位对齐地址的“movnti”指令是原子的吗?
Yes, movnti
在自然对齐的地址上是原子的,就像 x86 上所有其他自然对齐的 8/16/32/64b 存储(和加载)一样 https://stackoverflow.com/questions/36624881/why-is-integer-assignment-on-a-naturally-aligned-variable-atomic/36685056#36685056。无论内存类型如何(写回、写组合、不可缓存等),这都适用。请参阅该链接以了解 Intel x86 手册中的保证措辞。
请注意,原子性与内存排序是分开的。普通的 x86 存储是发布商店 https://stackoverflow.com/questions/12346487/what-do-each-memory-order-mean运营方面,movnt店却“轻松”。
有趣的事实:32 位代码可以使用 x87 (fild
/fistp
) 或 SSE/MMXmovq
执行原子 64 位加载/存储。海湾合作委员会的std::atomic
实施实际上就是这样做的。只有 SSE 访问大于 8B(例如movaps
or movntps
16B/32B/64B 向量存储)不保证原子性。 (即使 16B 操作在某些硬件上也是原子操作,但没有标准方法来检测这一点)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)