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

C++11原子:std::memory\u顺序代码是否可移植?

  •  1
  • Troskyvs  · 技术社区  · 7 年前

    在函数中,如 std::atomic::compare_exchange std::memory_order_release std::memory_order_relaxed ( http://en.cppreference.com/w/cpp/atomic/atomic/compare_exchange )

    std::memory_order

    你能给我一些建议吗?

    3 回复  |  直到 5 年前
        1
  •  6
  •   Nicol Bolas    7 年前

    C++标准确实有所谓的“独立”实现的概念,它可以支持标准库的一个子集。然而,它还定义了即使是独立的实现也必须支持的最低限度的功能。在该列表中是 整体性 <atomic> 标题。

    是的,实现必须支持这些。

    但要回答您的主要问题,是的,基于原子的代码是可移植的(模编译器错误)。

        2
  •  6
  •   Yakk - Adam Nevraumont    7 年前

    一般来说,编译器只提供 最强的

    在某些平台上,有足够的宽松保证。并非所有平台都支持这些宽松的保证。在这些平台上,编译器必须提供更严格的保证。

    因此它们是可移植的,因为编译程序必须提供这种保证 或者更好 当你要求特别担保时。

        3
  •  0
  •   Peter Cordes    5 年前

    在实践中,当前的编译器总是加强对消费语义的获取,因为不这样做就很难安全实现。要么:

    • 该架构甚至需要依赖访问的获取障碍(非常罕见,可能只有DEC-Alpha):然后编译器将在使用时使用获取障碍;
    • consume

      • 编译器可能会尝试这样做,但这很棘手,在编译器后端优化中断的某些情况下会失败(前端通常不会与其后端进行足够的通信,以避免仅用于消费);
      • 或者编译器编写者不关心效率,或者知道他们无法提供可靠的工作,所以他们提供了acquire,这在语义上是正确的,但实际上效率较低,而不是标准的意图。