[英]How do the thread local variables in the Rust standard library work?
您看到的不同配置与#[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::LocalKey
的os
变体,然后,根据平台,它可以使用pthreads (Unix)或Windows ZDB974238714CA8DE634A7CE1D083A14或其他东西。
WebAssembly 是一个特例:由于它不支持线程,TLS 将被转换为简单的 static 变量。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.