Rust Atomics and Locks 阅读笔记 第三章 Memory Ordering

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值