Function core::sync::atomic::fence

1.0.0 · source ·
pub fn fence(order: Ordering)
Expand description

原子栅栏。

根据指定的顺序,栅栏可防止编译器和 CPU 对其周围的某些类型的内存操作重新排序。 这会在它与其他线程中的原子操作或栅栏之间创建同步关系。

具有 (至少) Release 排序语义的栅栏 A 与具有 (至少) Acquire 语义的栅栏 B 同步,当且仅当存在操作 X 和 Y 时,这两个操作都在某个原子对象 M 上操作,使得 A 在 X 之前排序,Y 在 B 之前排序,并且 Y 观察到 M 的变化 这提供了 A 和 B 之间的依存关系。

    Thread 1                                          Thread 2

fence(Release);      A --------------
x.store(3, Relaxed); X ---------    |
                               |    |
                               |    |
                               -------------> Y  if x.load(Relaxed) == 3 {
                                    |-------> B      fence(Acquire);
                                                     ...
                                                 }

具有 ReleaseAcquire 语义的原子操作也可以与栅栏同步。

除了具有 AcquireRelease 语义外,具有 SeqCst 顺序的栅栏还参与其他 SeqCst 操作和/或栅栏的全局程序顺序。

接受 AcquireReleaseAcqRelSeqCst 排序。

Panics

如果 orderRelaxed,就会出现 panics。

Examples

use std::sync::atomic::AtomicBool;
use std::sync::atomic::fence;
use std::sync::atomic::Ordering;

// 基于自旋锁的互斥原语。
pub struct Mutex {
    flag: AtomicBool,
}

impl Mutex {
    pub fn new() -> Mutex {
        Mutex {
            flag: AtomicBool::new(false),
        }
    }

    pub fn lock(&self) {
        // 等待直到旧值为 `false`。
        while self
            .flag
            .compare_exchange_weak(false, true, Ordering::Relaxed, Ordering::Relaxed)
            .is_err()
        {}
        // 此栅栏与 `unlock` 中的存储同步。
        fence(Ordering::Acquire);
    }

    pub fn unlock(&self) {
        self.flag.store(false, Ordering::Release);
    }
}
Run