Struct std::thread::LocalKey1.0.0[−][src]

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

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

该密钥使用可用于目标平台的最快速度的实现。它用 thread_local! 宏实例化,主要方法是 with 方法。

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

初始化与销毁

初始化是在线程中对 with 的第一次调用中动态执行的,并且当线程退出时,实现 Drop 的值将被销毁。一些注意事项适用,下面将进行说明。

LocalKey 的初始化不能递归地依赖于它自己,以这种方式使用 LocalKey 会使初始化在第一次调用 with 时无限递归。

Examples

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;
});

// 每个线程以 1 的初始值开始
let t = thread::spawn(move|| {
    FOO.with(|f| {
        assert_eq!(*f.borrow(), 1);
        *f.borrow_mut() = 3;
    });
});

// 等待线程完成并在 panic 上退出
t.join().unwrap();

// 尽管有子线程,我们仍保留原始值 2
FOO.with(|f| {
    assert_eq!(*f.borrow(), 2);
});
Run

平台特定的行为

请注意,使用 “best effort” 可以确保运行线程本地存储中存储的类型的析构函数,但并非所有平台都可以保证将针对线程本地存储中的所有类型运行析构函数。

例如,有许多已知的警告未运行析构函数:

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

Implementations

获取对此 TLS 密钥中的值的引用。

如果此线程尚未引用此键,则将延迟地初始化该值。

Panics

如果该键当前正在运行其析构函数,则此函数将为 panic!(); 如果先前已为此线程运行了析构函数,则它可能 panic。

获取对此 TLS 密钥中的值的引用。

如果此线程尚未引用此键,则将延迟地初始化该值。 如果密钥已被销毁 (如果在析构函数中调用它可能会发生这种情况),此函数将返回 AccessError。

Panics

如果未初始化密钥并且密钥的初始化 panics,则此函数仍将 panic!()。

Trait Implementations

使用给定的格式化程序格式化该值。 Read more

Auto Trait Implementations

Blanket Implementations

获取 self 的 TypeId。 Read more

从拥有的值中一成不变地借用。 Read more

从拥有的值中借用。 Read more

执行转换。

执行转换。

发生转换错误时返回的类型。

执行转换。

发生转换错误时返回的类型。

执行转换。