C++20 的内存模型与 C++11 有何不同?
How does C++20's memory model differ from that of C++11?
C++11 引入了一种新的内存模型,让抽象机“运行”C++11 代码具有关于多线程的概念。它还引入了一组内存顺序,内存 load/store 操作遵守这些顺序。
C++20 的维基百科页面说它有
a revised memory model.
它给出的参考说C++11的内存模型有很多缺陷,C++20会修改。
有人可以举例说明 C++11 的内存模型带来的问题,以及 C++20 中的问题如何解决吗?
相关问题:
Introduction to C++11's memory model
正如@PeterM 所建议的那样,由于在 C++11 内存模型的形式化过程中发现的问题 post-facto,因此这是一个(主观上的)微小变化。
旧模型的定义是为了使用或多或少的硬件指令集在通用架构上实现不同的内存访问机制。具体来说,memory_order_acquire
和 memory_order_release
应该可以使用某种轻量级栅栏指令在 ARM 和 Power CPU 架构上实现。不幸的是,事实证明他们不能(!); NVIDIA GPU 也是如此,尽管十年前它们并不是真正的目标。
在这种情况下,有两个选择:
- 实施以符合标准 - 可能,但性能会很差,这不是我们的想法。
- 修正标准以更好地适应这些架构(同时不会完全弄乱模型)
显然选择了选项 2。
更多详情,请阅读:
- Lahav、Vafeiadis、Kang、Hur、Dreyer,Repairing Sequential Consistency in C/C++11。
- Hans Boehm 的 C++ 标准委员会论文 P0668R5: Revising the C++ memory model。
C++11 引入了一种新的内存模型,让抽象机“运行”C++11 代码具有关于多线程的概念。它还引入了一组内存顺序,内存 load/store 操作遵守这些顺序。
C++20 的维基百科页面说它有
a revised memory model.
它给出的参考说C++11的内存模型有很多缺陷,C++20会修改。
有人可以举例说明 C++11 的内存模型带来的问题,以及 C++20 中的问题如何解决吗?
相关问题: Introduction to C++11's memory model
正如@PeterM 所建议的那样,由于在 C++11 内存模型的形式化过程中发现的问题 post-facto,因此这是一个(主观上的)微小变化。
旧模型的定义是为了使用或多或少的硬件指令集在通用架构上实现不同的内存访问机制。具体来说,memory_order_acquire
和 memory_order_release
应该可以使用某种轻量级栅栏指令在 ARM 和 Power CPU 架构上实现。不幸的是,事实证明他们不能(!); NVIDIA GPU 也是如此,尽管十年前它们并不是真正的目标。
在这种情况下,有两个选择:
- 实施以符合标准 - 可能,但性能会很差,这不是我们的想法。
- 修正标准以更好地适应这些架构(同时不会完全弄乱模型)
显然选择了选项 2。
更多详情,请阅读:
- Lahav、Vafeiadis、Kang、Hur、Dreyer,Repairing Sequential Consistency in C/C++11。
- Hans Boehm 的 C++ 标准委员会论文 P0668R5: Revising the C++ memory model。