美文网首页
C++内存模型

C++内存模型

作者: blue_lights | 来源:发表于2021-09-18 11:51 被阅读0次

内存模型是多线程环境能够可靠工作的基础,因为内存模型需要对多线程环境的运作细节进行完备的定义。

内存模型通过共享数据描述线程之间的交互。




内存模型核心概念:

数据竞争(Data Race)

1、两个(或更多)线程同时访问同一个内存位置。

2、至少有一个线程正在修改。

内存顺序参数指定之间的顺序约束,不同线程中的原子和非原子内存访问。

内存栅栏(Memory Barrier)

为了提高性能,现代 CPU 经常乱序执行指令,以最大限度地利用可用的芯片(包括内存读/写)。因为硬件强制执行指令完整性,所以在单个执行线程中您永远不会注意到这一点。然而,对于具有易失性内存(例如内存映射 I/O)的多线程或环境,这可能会导致不可预测的行为。

内存栅栏/屏障是一类指令,这意味着内存读/写以您期望的顺序发生。例如,“完整栅栏”意味着栅栏之前的所有读/写都在栅栏之后的那些之前提交。

注意内存栅栏是一个硬件概念。在高级语言中,我们习惯于处理互斥体和信号量——这些很可能在低级使用内存栅栏来实现,并且不需要显式使用内存屏障。内存屏障的使用需要仔细研究硬件体系结构,并且在设备驱动程序中比在应用程序代码中更常见。

CPU 重新排序与编译器优化不同,如果可能导致不良行为(例如在 C 中使用 volatile 关键字),您需要采取单独的措施来阻止编译器重新排序您的指令,让开发者告诉编译器:这部分代码编译的时候不能乱序

参考:

C++内存模型

相关文章

  • 2018-11-11 #C++ 内存模型#

    C++ 原子操作内存模型 C++ 原子操作内存模型解决并发编程的什么问题? 相信在大多数应用程序员眼里,代码在编辑...

  • C++内存模型

    在讲述内存模型的时候,我们使用下面这段代码来涵盖各种内存分配的情况 这是内存变量图: rodata 和 text ...

  • C++内存模型

    普通成员函数存储方式 C++程序的内存格局通常分为四个区:全局数据区(data area),代码区(code ar...

  • C++内存模型

    内存模型是多线程环境能够可靠工作的基础,因为内存模型需要对多线程环境的运作细节进行完备的定义。 内存模型通过共享数...

  • C++_day06

    C++核心编程 主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓 1. 内存分区模型 C++程序...

  • NDK学习 之 Java对象映射C++对象

    背景 我们都知道Java内存模型和C++内存模型不同,而且是分开存储和管理的。做NDK开发的小伙伴经常遇到这样一个...

  • 开篇2:C/C++ 内存布局与程序栈

    如果你对C/C++基本数据类型的内存模型没概念的话,可以先查看该传送门《开篇1:C/C++ 内存中的数据表示》,反...

  • C++11 Memory Model

    Herb Sutter在一次对C++11内存模型的演讲中提到C++11的内存模型,让C++有了标准独立于编译器和平...

  • C++ 对象内存模型

    (很久之前写的了,先扔上来 继承 (无虚函数时) 单继承 类的对象的内存布局如下所示: 类中的成员变量的存储顺序从...

  • C++内存分区模型

    内存分区模型 C++程序在执行时,将程序大方向划分为4个区域 代码区:存放函数体的二进制代码,由操作系统进行管理的...

网友评论

      本文标题:C++内存模型

      本文链接:https://www.haomeiwen.com/subject/ooisgltx.html