繁体   English   中英

Rust标准库中的线程局部变量是如何工作的?

[英]How do the thread local variables in the Rust standard library work?

Rust标准库中的线程局部变量是如何工作的? 我查看了代码,但间接迷失了方向。 线程本地存储、操作系统相关模式和快速模式似乎有不同的配置。 哪一个是默认的,我该如何选择使用哪一个? 特别是,在 crate 中使用线程本地存储对 crate 的用户有什么影响?

使用线程本地存储非常简单,生成的程序集看起来非常高效,但是如果不完全理解其含义,我就无法在库中使用该功能。

我也问过:

您看到的不同配置与#[thread_local]相关,该功能旨在替换thread_local! 使用户代码更直接的宏,例如:

#![feature(thread_local)]

#[thread_local]
pub static mut VAR: u64 = 42;

但是,在撰写本文时,此功能尚未完全实现(您可以在此处找到跟踪问题)。 它在编译代码内部使用,这就是您std::thread::LocalKey的实际“快速”实现中看到的魔力:

#[thread_local]
#[cfg(all(
    target_thread_local,
    not(all(target_arch = "wasm32", not(target_feature = "atomics"))),
))]
static __KEY: $crate::thread::__FastLocalKeyInner<$t> =
    $crate::thread::__FastLocalKeyInner::new();

注意顶部的#[thread_local]属性。 然后将其转换为 LLVM IR,因此 TLS(线程本地存储)的实际实现 由 LLVM 承载并实现ELF TLS 模型 这是默认配置。

我该如何选择使用哪一个?

您需要编译自己的rustc版本,省略target_thread_local功能。 在这种情况下,将使用std::thread::LocalKeyos变体,然后,根据平台,它可以使用pthreads (Unix)Windows ZDB974238714CA8DE634A7CE1D083A14或其他东西。

WebAssembly 是一个特例:由于它不支持线程,TLS 将被转换为简单的 static 变量。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM