Section courante

A propos

Section administrative du site

thread_local

Processus léger local
Rust

Syntaxe

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

Description

Cette macro permet de déclarer une variable locale à un processus léger, via une clef de type std::thread::LocalKey<T>.

Remarques

Déclarez une nouvelle clef d'entreposage locale de processus léger de type std::thread::LocalKey.

La macro encapsule un nombre illimité de déclarations statiques et les rend locales au processus léger. La publicité et les attributs de chaque déclaration statique sont autorisés. Exemple :

  1. use std::cell::{Cell, RefCell};
  2.  
  3. thread_local! {
  4.     pub static FOO: Cell<u32> = const { Cell::new(1) };
  5.  
  6.     static BAR: RefCell<Vec<f32>> = RefCell::new(vec![1.0, 2.0]);
  7. }
  8.  
  9. assert_eq!(FOO.get(), 1);
  10. BAR.with_borrow(|v| assert_eq!(v[1], 2.0));

Notez que seules les références partagées (&T) aux données internes peuvent être obtenues. Un type tel que Cell ou RefCell est donc généralement utilisé pour autoriser l'accès par mutation.

Cette macro prend en charge une syntaxe const {} spéciale, utilisable lorsque l'expression d'initialisation peut être évaluée comme une constante. Cela permet une implémentation locale des processus légers plus efficace, évitant ainsi une initialisation différée. Pour les types qui n'ont pas besoin d'être supprimés, cela permet une implémentation encore plus efficace, sans suivi d'état supplémentaire.

  1. use std::cell::RefCell;
  2.  
  3. thread_local! {
  4.     pub static FOO: RefCell<Vec<u32>> = const { RefCell::new(Vec::new()) };
  5. }
  6.  
  7. FOO.with_borrow(|v| assert_eq!(v.len(), 0));


Dernière mise à jour : Mardi, le 5 Août 2025