Macro std::thread_local

1.0.0 · source ·
macro_rules! thread_local {
    () => { ... };
    ($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = const { $init:expr }; $($rest:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = const { $init:expr }) => { ... };
    ($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = $init:expr; $($rest:tt)*) => { ... };
    ($(#[$attr:meta])* $vis:vis static $name:ident: $t:ty = $init:expr) => { ... };
}
Expand description

声明一个新的 std::thread::LocalKey 类型的线程本地存储密钥。

Syntax

宏可以包装任意数量的静态声明,并使它们成为局部线程。 允许每个静态的公开和属性。Example:

use std::cell::RefCell;
thread_local! {
    pub static FOO: RefCell<u32> = RefCell::new(1);

    static BAR: RefCell<f32> = RefCell::new(1.0);
}

FOO.with(|foo| assert_eq!(*foo.borrow(), 1));
BAR.with(|bar| assert_eq!(*bar.borrow(), 1.0));
Run

此宏支持特殊的 const {} 语法,当初始化表达式可以被评估为常量时可以使用该语法。 这可以启用可以避免延迟初始化的更高效的线程本地实现。 对于不是 need to be dropped 的类型,这可以实现更高效的实现,无需跟踪任何其他状态。

use std::cell::Cell;
thread_local! {
    pub static FOO: Cell<u32> = const { Cell::new(1) };
}

FOO.with(|foo| assert_eq!(foo.get(), 1));
Run

有关更多信息,请参见 LocalKey 文档