gpt4 book ai didi

C++11 原子 x86 内存排序

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:55:24 26 4
gpt4 key购买 nike

在 C++0x 中原子变量的文档之一中,在描述内存顺序时,它提到:

Release-Acquire Ordering

On strongly-ordered systems (x86, SPARC, IBM mainframe), release-acquire ordering is automatic. No additional CPU instructions are issued for this synchronization mode, only certain compiler optimizations are affected...

首先,x86 遵循严格的内存排序是真的吗?总是强加这一点似乎效率很低。意味着每次写入和读取都有一个栅栏?

此外,如果我有一个对齐的 int,在 x86 系统上,原子变量是否有任何用途?

最佳答案

是的,x86 确实有严格的内存排序,请参阅 Intel manuals 的第 3A 卷第 8.2 章| .较旧的 x86 处理器(例如 386)提供了真正严格的排序(称为 强排序)语义,而更现代的 x86 处理器在某些情况下稍微放宽了条件,但您无需担心。例如,奔腾和 486 允许读取缓存未命中在写入缓存命中时先于缓冲写入(因此与读取的地址不同)。

是的,它可能效率低下。因此,有时高性能软件仅针对内存排序要求较宽松的其他架构编写。

是的,原子变量在 x86 上仍然有用。它们与编译器有特殊的语义,因此典型的 read-modify-write操作以原子方式发生。如果你有两个线程同时递增一个原子变量(我指的是 C++11 中类型为 std::atomic<T> 的变量),你可以确信该值会大 2;没有std::atomic ,您最终可能会得到错误的值,因为一个线程在执行递增时将当前值缓存在寄存器中,即使存储到内存在 x86 上是原子的。

关于C++11 原子 x86 内存排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11836028/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com