我在C ++ 11中有一些与内存模型有关的问题。
编写29.幻灯片上的https://www.think-cell.com/en/career/talks/pdf/think-cell_talk_memorymodel.pdf
C ++内存模型保证了顺序一致性
但是,在我以前的帖子中,我了解到C ++内存具有弱内存模型 - 编译器可以根据需要进行重新排序 - 他必须满足,就像规则一样。
答案 0 :(得分:8)
如果使用具有适当内存顺序的原子操作来保证顺序一致性,则C ++内存模型可以保证顺序一致性 。如果你只使用简单的非原子操作,或放松原子,而不使用互斥,那么就不能保证顺序一致性。
如果无法观察到行为上的差异,那么编译器可以自由地重新排序操作,这是假设规则。因此,例如,如果重新排序顺序一致的原子会产生不同的可观察结果,那么它就不符合as-if规则。如果它不会产生不同的可观察结果,则允许重新排序。
答案 1 :(得分:3)
我想通过阅读前面的幻灯片,我想出了那张幻灯片正在谈论的内容:
幻灯片12: 顺序一致[Leslie Lamport,1979]
相同
任何执行的结果都与 - 如果
- 所有线程的操作都在某些中执行 连续订单
- 每个线程的操作以此顺序出现 按照其程序指定的顺序
醇>
slide14: 无数据竞赛计划的顺序一致性 SC-DRF:强>
- 我们注意我们的程序不包含数据竞赛
- 系统保证按顺序执行一致
所以在幻灯片29上,作者说一旦你使用std::atomic
避免使用数据竞争UB,程序就会按照程序顺序运行。
这是查看C ++的弱内存模型的一种有趣方式。这看起来像是一组很好的幻灯片。
第二部分
请不要养成一次问两个非常不同的问题的习惯。
这" CPU如何做到这一点?"问题将更适合作为后续问题的一部分:Atomicity on x86
我已经写了大部分答案,我将把它放在那里。
答案 2 :(得分:-5)
定义具有未定义行为的语言的语义的唯一可能方法是描述顺序执行。因此,所有程序的行为都与顺序执行相同,或者没有程序定义行为。
同时拥有C / C ++的想法是一个骗局。 程序必须顺序执行才能使语义有意义。