【问题标题】:How does C++20's memory model differ from that of C++11?C++20 的内存模型与 C++11 的内存模型有何不同?
【发布时间】:2020-10-10 18:21:30
【问题描述】:

C++11 引入了一种新的内存模型,它让抽象机器“运行”C++11 代码有一个关于多线程的概念。它还介绍了一组内存加载/存储操作遵守的内存顺序。

C++20 的维基百科页面说它有

修改后的内存模型。

它给出的参考资料说,C++11 的内存模型有许多缺陷,C++20 将对其进行修改。

有人可以举一些例子来说明 C++11 的内存模型带来的问题,以及 C++20 中如何解决它?

相关问题: Introduction to C++11's memory model

【问题讨论】:

标签: c++ c++11 c++20


【解决方案1】:

正如@PeterM 所暗示的那样,由于事后发现 C++11 内存模型形式化的问题,这是一个(主观上)微小的变化。

定义了旧模型,以便可以使用或多或少成本高昂的硬件指令集在通用架构上实现不同的内存访问机制。具体来说,memory_order_acquirememory_order_release 应该可以使用某种轻量级围栏指令在 ARM 和 Power CPU 架构上实现。不幸的是,事实证明他们不能(!); NVIDIA GPU 也是如此,尽管十年前它们并不是真正的目标。

在这种情况下,有两种选择:

  1. 实施以符合标准 - 可能,但性能会很差,这不是我们的想法。
  2. 修复标准以更好地适应这些架构(同时不会完全弄乱模型)

显然选择了选项 2。

更多详情,请阅读:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-25
    • 2011-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-06
    • 1970-01-01
    相关资源
    最近更新 更多