本文简要介绍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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。