当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Rust fence用法及代码示例


本文简要介绍rust语言中 Function std::sync::atomic::fence 的用法。

用法

pub fn fence(order: Ordering)

原子栅栏。

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

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

Thread 1                                          Thread 2

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

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

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

接受 Acquire Release AcqRel SeqCst 排序。

Panics

如果 order Relaxed 则会出现Panics。

例子

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

// A mutual exclusion primitive based on spinlock.
pub struct Mutex {
    flag: AtomicBool,
}

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

    pub fn lock(&self) {
        // Wait until the old value is `false`.
        while self
            .flag
            .compare_exchange_weak(false, true, Ordering::Relaxed, Ordering::Relaxed)
            .is_err()
        {}
        // This fence synchronizes-with store in `unlock`.
        fence(Ordering::Acquire);
    }

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

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Function std::sync::atomic::fence。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。