置(Memory location)是可以一个标量类型(算术类型, 指针类型, 枚举类型)的对象或是最大的连续非零位域
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
线程 Threads 线程是指程序中使用 thrd_create 函数或其他方式调用顶级函数(top-level function)而开始的一个控制流 任何线程都可能访问程序中的任何对象(而 automatic 和 thread-local 存储期的对象可以在线程执行到这个点时被访问) 程序的不同线程总是被允许并发地访问(读取和修改)不同的内存位置,没有干扰阻碍也不须同步请求。 注意,并发的更新同一个结构体中的两个非自动存储期的位域是不安全的,如果在它们之间的所有被声明的成员也是位域(非零长度),不论这些中间的位域大小是多少
数据竞争 Data Races 当一个表达式的赋值操作向内存位置写操作并且另一个赋值操作读取和修改相同的内存位置,此表达式被称为冲突的。具有两个冲突的赋值操作的程序存在数据竞争,除非冲突的赋值操作都是自动类型的操作或者两个冲突操作先后发生 若果发生数据竞争, 那么程序行为是未定义的 互斥锁可以防止数据竞争
内存顺序 Memory order 当一个线程从一个内存位置读取一个值时, 该线程看到的可能是其初始值, 同一线程写入的值, 或者另一个线程写入的值 可通过查看内存顺序(memory_order)获取线程的写入顺序对另一个线程可见的细节.
动态内存分配 在栈中分配内存则能够自动释放, 在堆中分配内存不能够自动释放, 后者若不释放会发生内存泄露(leakage) 用 sbrk(2) 系统调用实现扩充或减小进程的堆 与动态分配内存相对的概念是编译时分配内存, 即 data 段等
NULL
object |
meaning |
describe |
NULL |
标准头文件中定义的宏 |
用于表示什么也不指向的指针,也就是空指针((void *)0), 除了指针, 其他变量使用 NULL可能导致任何问题 |
0 |
整型常量 |
可以被用于任何地方,它是表示各种类型零值的通用符号并且编译器会识别出它 |
‘\0’ |
字符常量 |
字符串结束字符, 只应用于字符上下文 |
|