AlexZhao 2020-06-04
x86/x86_64
支持LOCK
前缀的指令是原子操作;注: 使用条件仅仅针对Rust, 当前1.43.1版本中Rust的所有Atomic**
实现中都加了#[cfg(target_has_atomic_load_store = "8")]
属性配置;
为什么需要内存顺序?
Rust原子操作操作有5中内存顺序: Relaxed/Release/Acquire/AcqRel/SeqCst
, 下面一一介绍;
没有内存顺序约束, 仅仅是原子类型的本条store/load
操作是原子操作, 即针对该原子类型的在不同线程之间的操作顺序是任意的;
Release
和Acquire
是在不同的线程间针对同一原子类型对象的进行store
和load
操作时配合使用. 当一个线程store
withRelease
写原子类型对象, 而有另一个线程load
withAcquire
度原子类型对象时, 那么在写及写之前的所有写原子操作都是发生在另一个线程中读该原子类型之后的所有读原子操作之前.
简而言之就是, Release
之前的写原子操作先于Acquire
之后的读原子操作;
和Release/Acquire的效果一样, 只不过是读的时候使用Acquire
顺序, 写的时候使用Release
顺序;
若某一原子类型对象在不同线程中使用SeqCst
读写, 那么该原子操作之前的所有读写原子操作都先于该原子操作之后的读写操作