c++ - C++20 的内存模型与 C++11 的内存模型有何不同?
问题描述
C++11 引入了一种新的内存模型,让抽象机器“运行”C++11 代码有一个关于多线程的概念。它还引入了一组内存顺序,内存加载/存储操作遵守这些顺序。
C ++ 20的维基百科页面说它有
修改后的记忆模型。
它给出的参考资料说 C++11 的内存模型有许多缺陷,C++20 将对其进行修改。
有人可以举一些例子来说明 C++11 的内存模型带来的问题,以及 C++20 中的问题如何解决?
相关问题: C++11的内存模型介绍
解决方案
正如@PeterM 所暗示的那样,由于事后发现 C++11 内存模型形式化的问题,它是一个(主观上)微小的变化。
旧模型被定义为可以使用或多或少成本高昂的硬件指令集在通用架构上实现不同的内存访问机制。具体来说,memory_order_acquire
应该memory_order_release
可以使用某种轻量级围栏指令在 ARM 和 Power CPU 架构上实现。不幸的是,事实证明他们不能(!);NVIDIA GPU 也是如此,尽管十年前它们并不是真正的目标。
在这种情况下,有两种选择:
- 实施以符合标准 - 可能,但性能会非常糟糕,这不是想法。
- 修复标准以更好地适应这些架构(同时不完全弄乱模型)
显然选择了选项 2。
有关更多详细信息,请阅读:
- Lahav、Vafeiadis、Kang、Hur、Dreyer,修复 C/C++11 中的顺序一致性。
- Hans Boehm 的 C++ 标准委员会论文P0668R5:修订 C++ 内存模型。
推荐阅读
- python - 如何使用pyspark从文件中查找分隔符
- javascript - Fusion Charts Zoomline React 错误:ChunkLoadError:加载块 6 失败
- command-line - 如何在命令行上处理 .fsproj 文件?
- python - 在 Flask 中将蓝图注册到应用程序中是什么意思?
- javascript - 如何添加属性或更改按钮的样式 onPress react native - native base
- reactjs - 提供者值上的 Typescript React UseReducer 类型错误
- python - 向 Django 频道消费者发送数据
- javascript - 编辑功能不保存对 React 中状态数据的更改
- python - Pandas 基于另一列的条件移位
- javascript - 正确的工作流程 React.js