2016-07-17 63 views
4

我有一些问题与C++ 11中的内存模型有关。C++中的内存模型:顺序一致性和原子性

https://www.think-cell.com/en/career/talks/pdf/think-cell_talk_memorymodel.pdf在29幻灯片写入

C++的内存模型保证顺序一致性

可是,在我以前的帖子中,我了解到,C++内存具有弱内存模型 - 编译器可以按他的意愿进行重新订购 - 他必须满足,就好像规则。

+5

每个问题请提出一个问题! – MrEricSir

回答

2

我想我想通了什么幻灯片讲,从阅读前面的幻灯片:

幻灯片12: 顺序一致性[莱斯利·兰波特,1979
任何执行的结果是同样,如果

  1. 所有线程的操作在一些 顺序执行
  2. 的每个线程的操作出现在该序列 在通过程序指定的顺序

slide14: 用于数据争自由的程序
SC-DRF顺序一致性:

  • 我们注意我们的程序不包含在数据争
  • 系统保证顺序一致的执行

所以幻灯片29,作者是说一旦你避免使用std::atomic数据竞争UB,程序运行的,如果一切都在发生程序订单。

这是一个有趣的方式来看待C++的弱记忆模型。这看起来像一组很好的幻灯片。


第二部分

请不要问两个非常不同的问题,在一次的习惯。

这个“CPU怎么做?”问题会更适合作为你后面的问题的一部分:Atomicity on x86

我已经写了大部分的答案,我将它放在那里。

+0

我编辑了这些帖子,使其更加清晰。 – Gilgamesz

7

如果您使用具有适当内存顺序的原子操作来保证顺序一致性,C++内存模型保证了顺序一致性。如果你只是使用普通的非原子操作,或者放松原子操作,并且没有互斥,那么顺序一致性就不能保证。

如果不能观察行为差异,那么编译器可以自由地重新排序操作,这就是as-if规则。例如,如果顺序一致的原子重新排序会产生不同的可观察结果,那么它不符合as-if规则。如果它不会产生不同的可观察结果,则允许重新排序。

+1

好的,很明显。 C++具有弱模型。 – Gilgamesz

+0

@PeterCordes,谢谢:) – Gilgamesz

+0

更新,幻灯片不是马虎,所以我删除了我的prev评论。看到我的答案,我认为他们的意思是在那里。尽管如此,一张幻灯片不应该让你怀疑[C++的默认软件内存模型是弱/放松]的所有其他证据(http://preshing.com/20120930/weak-vs-strong-memory-models/),包括一个zillion网页和编译器的实际行为。 –