C ++中的内存模型:顺序一致性和原子性

时间:2016-07-17 21:05:16

标签: c++ multithreading c++11 x86

我在C ++ 11中有一些与内存模型有关的问题。

编写29.幻灯片上的https://www.think-cell.com/en/career/talks/pdf/think-cell_talk_memorymodel.pdf

  

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

但是,在我以前的帖子中,我了解到C ++内存具有弱内存模型 - 编译器可以根据需要进行重新排序 - 他必须满足,就像规则一样。

3 个答案:

答案 0 :(得分:8)

如果使用具有适当内存顺序的原子操作来保证顺序一致性,则C ++内存模型可以保证顺序一致性 。如果你只使用简单的非原子操作,或放松原子,而不使用互斥,那么就不能保证顺序一致性。

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

答案 1 :(得分:3)

我想通过阅读前面的幻灯片,我想出了那张幻灯片正在谈论的内容:

  

幻灯片12:   顺序一致[Leslie Lamport,1979]
  任何执行的结果都与 - 如果

相同      
      
  1. 所有线程的操作都在某些中执行   连续订单
  2.   
  3. 每个线程的操作以此顺序出现   按照其程序指定的顺序
  4.   

  

slide14:   无数据竞赛计划的顺序一致性         SC-DRF:

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

所以在幻灯片29上,作者说一旦你使用std::atomic避免使用数据竞争UB,程序就会按照程序顺序运行。

这是查看C ++的弱内存模型的一种有趣方式。这看起来像是一组很好的幻灯片。

第二部分

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

这" CPU如何做到这一点?"问题将更适合作为后续问题的一部分:Atomicity on x86

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

答案 2 :(得分:-5)

定义具有未定义行为的语言的语义的唯一可能方法是描述顺序执行。因此,所有程序的行为都与顺序执行相同,或者没有程序定义行为。

同时拥有C / C ++的想法是一个骗局。 程序必须顺序执行才能使语义有意义。