内存模型是多线程环境能够可靠工作的基础,因为内存模型需要对多线程环境的运作细节进行完备的定义。
内存模型通过共享数据描述线程之间的交互。
内存模型核心概念:
数据竞争(Data Race)
1、两个(或更多)线程同时访问同一个内存位置。
2、至少有一个线程正在修改。
内存顺序参数指定之间的顺序约束,不同线程中的原子和非原子内存访问。
内存栅栏(Memory Barrier)
为了提高性能,现代 CPU 经常乱序执行指令,以最大限度地利用可用的芯片(包括内存读/写)。因为硬件强制执行指令完整性,所以在单个执行线程中您永远不会注意到这一点。然而,对于具有易失性内存(例如内存映射 I/O)的多线程或环境,这可能会导致不可预测的行为。
内存栅栏/屏障是一类指令,这意味着内存读/写以您期望的顺序发生。例如,“完整栅栏”意味着栅栏之前的所有读/写都在栅栏之后的那些之前提交。
注意内存栅栏是一个硬件概念。在高级语言中,我们习惯于处理互斥体和信号量——这些很可能在低级使用内存栅栏来实现,并且不需要显式使用内存屏障。内存屏障的使用需要仔细研究硬件体系结构,并且在设备驱动程序中比在应用程序代码中更常见。
CPU 重新排序与编译器优化不同,如果可能导致不良行为(例如在 C 中使用 volatile 关键字),您需要采取单独的措施来阻止编译器重新排序您的指令,让开发者告诉编译器:这部分代码编译的时候不能乱序。














网友评论