- 编译器有时候为了优化计算效率,在确保没有严重后果的情况下会调整某些指令的执行顺序,Page49给出了一个样例;
- Relaxed内存顺序是最基础同时也是性能最好的内存模型,因为它不会触发多线程之间的happens-before关系,Page52给了一个Relaxed顺序会出现的一种情形;
- 在同一个线程中,对同一个atomic变量的操作可以认为是有先后顺序的,但是同一线程中的多个atomic变量的变更顺序,在另一个线程中呈现的顺序未必是有序的,还是Page52的示例;
- Page54的样例说明,尽管对atomic变量的变更顺序有多种可能,但是所有的线程观察到的现象肯定是同一个顺序;
- Release和Acquire顺序分别对应了store和load操作,对store操作使用release顺序和对load操作使用acquire顺序保证了在store操作的线程中,store之前的所有行为,对于load操作所在线程的load操作之后的行为,都是可见的,具体见Page57的示例;
- mutex的实现使用了release和acquire顺序的原子操作,lock操作时先使用acquire ordering检查是否已经unlocked,然后把状态改为"locked"(这里使用的是compare_exchange操作),unlock操作时使用release ordering把状态改为"unlocked",详见page61的例子;
- Consume-load会在load一些dependent expressions的变量(例如
*x, array[x], table.lookup(x+1)
)时出现已经load到x的值,但是x指向的值还未初始化的情况,目前没有编译器实现consume ordering,用acquire ordering替代,Rust也没有暴露Ordering::Consume这个内存顺序; Ordering::SeqCst
是最强的内存顺序模型,包含acquire-load和release-store的所有保证,同时保证了全局的顺序一致性。尽管这看上去是一个最简单的内存顺序模型,但绝大部分场景使用常规的acquire-release顺序就已经足够,SeqCst确保对同一个变量的store和load,store之前的所有操作对load都是可见的,反之亦然;std::sync::atomic::fence
可以用来保证多个relaxed store 或者 relaxed load的happened-before关系,可见Page68的样例;
Rust Atomics and Locks 阅读笔记 第三章 Memory Ordering
最新推荐文章于 2024-09-14 13:59:48 发布