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


Rust LocalKey用法及代码示例


本文简要介绍rust语言中 Struct std::thread::LocalKey 的用法。

用法

pub struct LocalKey<T: 'static> { /* fields omitted */ }

拥有其内容的线程本地存储 key 。

此 key 使用可用于目标平台的最快实现。它使用 thread_local! 宏进行实例化,主要方法是 with 方法。

with 方法产生对包含值的引用,该引用不能跨线程发送或转义给定的闭包。

初始化和销毁

初始化在线程内第一次调用 with 时动态执行,实现 Drop 的值在线程退出时被破坏。一些注意事项适用,下文将对此进行解释。

LocalKey 的初始化程序不能递归地依赖于自身,并且以这种方式使用 LocalKey 将导致初始化程序在第一次调用 with 时无限递归。

例子

use std::cell::RefCell;
use std::thread;

thread_local!(static FOO: RefCell<u32> = RefCell::new(1));

FOO.with(|f| {
    assert_eq!(*f.borrow(), 1);
    *f.borrow_mut() = 2;
});

// each thread starts out with the initial value of 1
let t = thread::spawn(move|| {
    FOO.with(|f| {
        assert_eq!(*f.borrow(), 1);
        *f.borrow_mut() = 3;
    });
});

// wait for the thread to complete and bail out on panic
t.join().unwrap();

// we retain our original value of 2 despite the child thread
FOO.with(|f| {
    assert_eq!(*f.borrow(), 2);
});

特定于平台的行为

请注意,“best effort” 是为了确保运行存储在线程本地存储中的类型的析构函数,但并非所有平台都可以保证将为线程本地存储中的所有类型运行析构函数。例如,有一些已知的警告没有运行析构函数:

  1. 在 Unix 系统上,当使用基于 pthread 的 TLS 时,当主线程退出时,不会针对主线程上的 TLS 值运行析构函数。请注意,应用程序也会在主线程退出后立即退出。
  2. 在所有平台上,TLS 都可以在销毁期间重新初始化其他 TLS 插槽。一些平台通过防止重新初始化已销毁的任何插槽来确保这种情况不会无限发生,但并非所有平台都有此保护。那些没有保护的平台通常有一个综合限制,在此之后不再运行析构函数。

相关用法


注:本文由纯净天空筛选整理自rust-lang.org大神的英文原创作品 Struct std::thread::LocalKey。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。