我不确定我是否完全理解(我可能完全错了)C++11 中的原子性和内存排序的概念。让我们看这个简单的单线程示例:
int main()
{
std::atomic<int> a(0);
std::atomic<int> b(0);
a.store(16);
b.store(10);
return 0;
}
在这个单线程代码中,如果 a 和 b 不是原子类型,编译器可能会以在汇编代码中的方式重新排序指令,例如,在移动指令之前,我有一条移动指令将 10 分配给 'b'将 16 分配给“a”。所以对我来说,作为原子变量,它保证我在“b 移动指令”之前有“a 移动指令”,正如我在源代码中所说的那样。在那之后,有处理器和他的执行单元、预取指令和他的乱序框。并且该处理器可以在“a指令”之前处理“b指令”,无论汇编代码中的指令顺序是什么。
据我了解,这就是内存排序模型出现的地方。从那一刻起,如果我让默认模型顺序一致。可以保证我在主内存中清除这些值(10 和 16)将尊重我在源代码中存储的顺序。这样处理器将开始刷新寄存器或高速缓存,其中 16 存储到主存储器中以更新“a”,然后它将刷新主存储器中的 10 以用于“b”。
所以这种行为确实让我明白,如果我使用宽松的记忆模型。只有最后一部分不能保证,因此主内存中的刷新可能完全无序。
抱歉,如果您阅读我的内容有困难,我的英语仍然很差。但是谢谢你们的时间。