Макрос 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,
который содержит средства асинхронного программирования