當前位置: 首頁>>代碼示例 >>用法及示例精選 >>正文


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。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。