Namespaces
Variants

Memory model

From cppreference.net

定义C抽象机中计算机内存存储的语义。

C程序可用的数据存储(内存)是一个或多个连续的 字节 序列。内存中的每个字节都有一个唯一的 地址

目录

字节

一个 字节 是内存中最小的可寻址单元。它被定义为一个连续的比特序列,其容量足以容纳 基本执行字符集 的任何成员( 这96个字符 必须为单字节)。C语言支持8位及更大尺寸的字节。

类型 char unsigned char signed char 使用一个字节进行存储和 值表示 。一个字节中的位数可通过 CHAR_BIT 获取。

关于使用字节表示其他基本类型值(包括大端序和小端序内存布局),请参阅 对象表示

内存位置

一个 内存位置

  • 一个 标量类型 的对象(算术类型、指针类型、枚举类型)
  • 或长度非零的 位域 的最大连续序列
struct S
{
    char a;     // 内存位置 #1
    int b : 5;  // 内存位置 #2
    int c : 11, // 内存位置 #2(续)
          : 0,
        d : 8;  // 内存位置 #3
    struct
    {
        int ee : 8; // 内存位置 #4
    } e;
} obj; // 对象 'obj' 由4个独立的内存位置组成

线程与数据竞争

执行线程是程序内部的控制流,始于通过 thrd_create 或其他方式调用顶层函数。

任何线程都可能访问程序中的任何对象(具有自动和线程局部 存储期 的对象仍可能通过指针被其他线程访问)。

始终允许不同的执行线程并发访问(读取和修改)不同的 内存位置 ,无需干预且无同步要求。(注意:如果两个非原子位域之间的所有成员也都是(非零长度)位域,则并发更新同一结构中的这两个非原子位域是不安全的,无论这些中间位域的大小如何)

当对某个表达式的 求值 写入内存位置,而另一个求值读取或修改同一内存位置时,称这些表达式存在 冲突 。若程序存在两个冲突的求值,则发生 数据竞争 ,除非满足以下任一条件:

若发生数据竞争,则程序行为未定义。

(特别地, mtx_unlock 与另一个线程对同一互斥量的 mtx_lock 存在 同步关系 ,因此 先发生于 后者,这使得可以通过互斥锁防护数据竞争)

内存顺序

当线程从内存位置读取值时,可能看到初始值、同一线程写入的值或其他线程写入的值。关于线程写入操作对其他线程可见的顺序细节,请参阅 memory_order

(C11 起)

参考文献

  • C23 标准 (ISO/IEC 9899:2024):
  • 3.6 字节 (p: TBD)
  • 3.14 内存位置 (p: TBD)
  • 5.1.2.4 多线程执行与数据竞争 (p: TBD)
  • C17 标准 (ISO/IEC 9899:2018):
  • 3.6 字节 (p: TBD)
  • 3.14 内存位置 (p: TBD)
  • 5.1.2.4 多线程执行与数据竞争 (p: TBD)
  • C11 标准 (ISO/IEC 9899:2011):
  • 3.6 字节 (p: 4)
  • 3.14 内存位置 (p: 5)
  • 5.1.2.4 多线程执行与数据竞争 (p: 17-21)
  • C99标准(ISO/IEC 9899:1999):
  • 3.6 字节(p: 4)
  • C89/C90 标准 (ISO/IEC 9899:1990):
  • 1.6 术语定义

参阅

C++ 文档 关于 Memory model