Rust Ordering语义理解

Posted mengsuenyan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rust Ordering语义理解相关的知识,希望对你有一定的参考价值。

Rust Ordering语义理解


应用场景/条件

  • 应用场景: 多线程之间使用原子类型通过共享内存的方式进行线程间通信;
  • 使用条件: 支持原子类型操作的指令集架构平台, 如x86/x86_64支持LOCK前缀的指令是原子操作;

注: 使用条件仅仅针对Rust, 当前1.43.1版本中Rust的所有Atomic**实现中都加了#[cfg(target_has_atomic_load_store = "8")]属性配置;

为什么需要内存顺序?

  • 一些编译器有指令重排功能以优化代码执行效率, 在不同线程中针对同一变量(内存)的读写顺序可能会被打乱, 不能保证顺序的一致性;
  • 一些处理器中有Cache缓存, 对某一内存的读取可能是从缓存中直接读取, 因此不同线程对同一变量的读写顺序亦不能保证一致性;

原子内存顺序

Rust原子操作操作有5中内存顺序: Relaxed/Release/Acquire/AcqRel/SeqCst, 下面一一介绍;

Relaxed

没有内存顺序约束, 仅仅是原子类型的本条store/load操作是原子操作, 即针对该原子类型的在不同线程之间的操作顺序是任意的;

Release/Acquire

ReleaseAcquire是在不同的线程间针对同一原子类型对象的进行storeload操作时配合使用. 当一个线程storewithRelease写原子类型对象, 而有另一个线程loadwithAcquire度原子类型对象时, 那么在写及写之前的所有写原子操作都是发生在另一个线程中读该原子类型之后的所有读原子操作之前.

简而言之就是, Release之前的原子操作先于Acquire之后的原子操作;

AcqRel

和Release/Acquire的效果一样, 只不过是读的时候使用Acquire顺序, 写的时候使用Release顺序;

SeqCst

若某一原子类型对象在不同线程中使用SeqCst读写, 那么该原子操作之前的所有读写原子操作都先于该原子操作之后的读写操作

参考资料


以上是关于Rust Ordering语义理解的主要内容,如果未能解决你的问题,请参考以下文章

在这个 spark 代码片段中 ordering.by 是啥意思?

图像描述文献阅读Comprehending and Ordering Semantics for Image Captioning

rust猜数游戏代码

Rust语言教程 - 所有权

修改后的 Rust Book 猜谜游戏查询

Rust所有权语义模型