代码之家  ›  专栏  ›  技术社区  ›  Jaebum

CPU如何提供内存顺序获取保证?

  •  0
  • Jaebum  · 技术社区  · 6 年前

    我一直在研究C++ 11中的内存顺序语义,并且在理解如何在CPU级别中实现MexyYOrthOrgy时有一定的困难。

    根据CPPPreference;

    具有此内存顺序的加载操作执行获取操作 在受影响的内存位置:当前没有读或写 线程可以在此加载之前重新排序。其他线程中的所有写操作 释放相同的原子变量在当前 线程(参见下面的发布获取顺序)

    在此之前,当前线程中的任何读或写都不能重新排序 装载。

    如果CPU在到达“内存顺序获取”部分之前已经重新排序了命令,会发生什么情况?CPU是否还原所有已完成的工作?如何保证?

    2 回复  |  直到 6 年前
        1
  •  1
  •   MSalters    6 年前

    CPU无法“到达” memory_order_acquire

    例如,如果CPU只在最多2条指令上重新排序,插入2个NOP指令将是实现语义部分的一个相当简单的方法。

        2
  •  0
  •   dgnuff    6 年前

    如第二段所述 here

    只要最终结果正确,程序的指令就不能以正确的顺序运行。

    OoOE不仅仅是盲目地执行任何可用的东西。CPU将包含明确禁止跨边界重新排序这些访问的逻辑。正如那篇文章的其他部分所指出的,OoOE的硅成本相当昂贵,很可能是由于这类问题。

    如中所述 this SO question