Memory model
定义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
|