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