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


Rust Once.call_once用法及代碼示例


本文簡要介紹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-lang.org大神的英文原創作品 std::sync::Once.call_once。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。