РЕПЕТИТОР математика физика информатика
Для школьников и студентов. Подтягивание пробелов. ЦЭ, ЦТ, ОГЭ, ЕГЭ.
Идет набор на ЛЕТО. Жмите для подробностей:)
1094 of 1245 menu

Макрос thread_local!

Макрос thread_local! создает переменную, значение которой является локальным для каждого потока. Это означает, что каждый поток получает собственную независимую копию значения, и изменения, сделанные в одном потоке, не видны другим потокам. Параметром макрос принимает статическую переменную, инициализируемую выражением, которое вычисляется отдельно для каждого потока.

Такие переменные удобны для хранения данных, которые не должны разделяться между потоками: кэшей, счетчиков, конфигураций, связанных с текущим потоком. Доступ к значению осуществляется через метод with, который принимает замыкание.

Синтаксис

thread_local! { static NAME: Type = value; }

Пример

Давайте создадим локальную для потока переменную и выведем ее значение:

use std::cell::Cell; thread_local! { static COUNTER: Cell<u32> = Cell::new(0); } fn main() { COUNTER.with(|c| { c.set(5); println!("{}", c.get()); }); }

Результат выполнения кода:

5

Пример

Давайте убедимся, что каждый поток получает собственную копию значения:

use std::cell::Cell; use std::thread; thread_local! { static VALUE: Cell<u32> = Cell::new(0); } fn main() { VALUE.with(|v| v.set(100)); println!("main: {}", VALUE.with(|v| v.get())); let handle = thread::spawn(|| { VALUE.with(|v| v.set(200)); println!("thread: {}", VALUE.with(|v| v.get())); }); handle.join().unwrap(); println!("main after: {}", VALUE.with(|v| v.get())); }

Результат выполнения кода:

main: 100 thread: 200 main after: 100

Пример

Давайте используем локальную для потока переменную для хранения кэша строк:

use std::cell::RefCell; thread_local! { static CACHE: RefCell<Vec<String>> = RefCell::new(Vec::new()); } fn main() { CACHE.with(|c| { c.borrow_mut().push(String::from("abcde")); c.borrow_mut().push(String::from("12345")); println!("{:?}", c.borrow()); }); }

Результат выполнения кода:

["abcde", "12345"]

Смотрите также

  • структура OnceLock,
    которая хранит значение, инициализируемое один раз
  • структура Once,
    которая гарантирует однократный вызов функции
  • структура AtomicUsize,
    которая хранит атомарное целое число
  • модуль async,
    который содержит средства асинхронного программирования
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить