当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


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