Memory model
内存模型
为C抽象机器的目的定义计算机内存存储的语义。
C程序可用的数据存储(内存)是一个或多个连续的字节
序列。内存中的每个字节
都有一个唯一的地址
。
字节
字节
是最小的可寻址内存单元。它被定义为一个连续的位序列,足够大以容纳基本执行字符集的
任何成员(96个字符必须是单字节
)。C支持8位或更大的字节
。
存储和值表示的类型char
,unsigned char
并signed char
使用一个字节。一个字节中的位数可以被访问为CHAR_BIT
。
内存位置
存储器位置
是。
- 标量类型的对象(算术类型,指针类型,枚举类型)
struct S {
char a; // memory location #1
int b : 5; // memory location #2
int c : 11, // memory location #2 (continued)
: 0,
d : 8; // memory location #3
struct {
int ee : 8; // memory location #4
} e;
} obj; // The object 'obj' consists of 4 separate memory locations
线程和数据竞争执行线程是程序中的一个控制流程,以thrd_create或其他方式调用顶级函数开始。任何线程都可能访问程序中的任何对象(具有自动和线程本地存储持续时间的对象仍然可以由另一个线程通过指针访问)。不同的执行线程总是被允许同时访问(读取和修改)不同的内存位置,不会产生干扰,也不需要同步。(注意,如果在它们之间声明的所有成员也是(非零长度)位字段,则同时更新同一结构中的两个非原子位字段是不安全的,不管这些介入位字段的大小如何,田野碰巧是)。当表达式的评估写入内存位置并且另一个评估读取或修改相同的内存位置时,表达式被认为是冲突的。有两个相互冲突的评估的程序除了两者之外还有数据竞争。两个冲突的评估都是原子操作冲突评估之一发生在另一个之前(请参阅memory_order)如果发生数据竞争,则程序的行为未定义。(特别是,mtx_unlock是与synchronized同步的,因此会在另一个线程的同一个互斥体的mtx_lock之前发生,这使得使用互斥锁来防范数据争夺成为可能)。内存顺序当一个线程从一个线程读取一个值内存位置,它可能会看到初始值,写入同一线程的值或写入另一个线程的值。 | (自C11以来) |
---|
- 两个相互冲突的评估都是原子操作
如果发生数据竞争,程序的行为是未定义的。(特别mtx_unlock
是。
与
另一个线程在同一个互斥体之前
mtx_lock
进行同步
并因此发生
,这使得可以使用互斥锁来防止数据竞争)内存顺序
当线程从内存位置读取值时,它可能会看到初始值,写入同一线程的值或写入另一个线程的值。请参阅有关memory_order
线程写入的顺序对其他线程可见的详细信息。
(since C11)
参考
- C11 standard (ISO/IEC 9899:2011):