本文簡要介紹rust語言中 Function core::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 fence用法及代碼示例
- Rust f32.exp用法及代碼示例
- Rust f32.hypot用法及代碼示例
- Rust f32.minimum用法及代碼示例
- Rust f64.signum用法及代碼示例
- Rust f64.sqrt用法及代碼示例
- Rust f32.sqrt用法及代碼示例
- Rust f32.abs_sub用法及代碼示例
- Rust f64.is_finite用法及代碼示例
- Rust f32.cos用法及代碼示例
- Rust f32.is_sign_positive用法及代碼示例
- Rust f32.log10用法及代碼示例
- Rust f64.round用法及代碼示例
- Rust format_args用法及代碼示例
- Rust f32.total_cmp用法及代碼示例
- Rust f64.div_euclid用法及代碼示例
- Rust f64.hypot用法及代碼示例
- Rust f32.from_ne_bytes用法及代碼示例
- Rust f32.recip用法及代碼示例
- Rust f64.floor用法及代碼示例
- Rust f64.log用法及代碼示例
- Rust from_u32_unchecked用法及代碼示例
- Rust f64.asinh用法及代碼示例
- Rust f64.classify用法及代碼示例
- Rust f32.sinh用法及代碼示例
注:本文由純淨天空篩選整理自rust-lang.org大神的英文原創作品 Function core::sync::atomic::fence。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。