本文简要介绍rust语言中 std::sync::Once.call_once
的用法。
用法
pub fn call_once<F>(&self, f: F) where F: FnOnce(),
执行一次初始化例程且仅执行一次。如果这是第一次,将执行给定的闭包call_once
已被调用,否则例程将不是被调用。
如果另一个初始化例程当前正在运行,此方法将阻塞调用线程。
当这个函数返回时,保证一些初始化已经运行并完成(它可能不是指定的闭包)。还保证了执行的闭包执行的任何内存写入此时都可以被其他线程可靠地观察到(闭包与返回后执行的代码之间存在happens-before关系)。
如果给定的闭包在同一个 Once
实例上递归调用call_once
,则未指定确切的行为,则允许的结果是Panics或死锁。
例子
use std::sync::Once;
static mut VAL: usize = 0;
static INIT: Once = Once::new();
// Accessing a `static mut` is unsafe much of the time, but if we do so
// in a synchronized fashion (e.g., write once or read all) then we're
// good to go!
//
// This function will only call `expensive_computation` once, and will
// otherwise always return the value returned from the first invocation.
fn get_cached_val() -> usize {
unsafe {
INIT.call_once(|| {
VAL = expensive_computation();
});
VAL
}
}
fn expensive_computation() -> usize {
// ...
}
Panics
关闭f
如果在多个线程中同时调用,则只会执行一次。然而,如果该关闭引起Panics,那么它将毒这个std::sync::Once实例,导致所有未来的调用call_once
也Panics。
这类似于 poisoning with mutexes 。
相关用法
- Rust Once.call_once_force用法及代码示例
- Rust Once.is_completed用法及代码示例
- Rust OnceCell用法及代码示例
- Rust OnceCell.set用法及代码示例
- Rust OnceCell.into_inner用法及代码示例
- Rust Once用法及代码示例
- Rust OnceState.is_poisoned用法及代码示例
- Rust OnceCell.get_or_init用法及代码示例
- Rust OnceCell.take用法及代码示例
- Rust OnceCell.get_or_try_init用法及代码示例
- Rust OsStr.to_ascii_uppercase用法及代码示例
- Rust Option.unwrap_or_default用法及代码示例
- Rust Octal用法及代码示例
- Rust Option.as_deref_mut用法及代码示例
- Rust Option.get_or_insert_with用法及代码示例
- Rust Option.iter_mut用法及代码示例
- Rust OsStr.make_ascii_lowercase用法及代码示例
- Rust OsString.clear用法及代码示例
- Rust OpenOptionsExt.custom_flags用法及代码示例
- Rust Option.or_else用法及代码示例
- Rust Option.unwrap_unchecked用法及代码示例
- Rust Option.get_or_insert用法及代码示例
- Rust OpenOptions.append用法及代码示例
- Rust Option.expect用法及代码示例
- Rust Ordering.then用法及代码示例
注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 std::sync::Once.call_once。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。