A thread local storage


#1

Пытаюсь использовать thread local storage
Пример работы с ним, приведенный по ссылке работает.
меняем тип переменной с u32 на tuple - (u32, u32) перстаёт работать.

thread_local! {	static FOO: RefCell<(u32,u32)> = RefCell::new( (1,3) );}

FOO.with(| f | {	assert_eq!(*f.borrow().0, 1);	});

вопрос: что у меня с лыжами ?

error[E0614]: type u32 cannot be dereferenced
–> src\main.rs:62:14
|
62 | assert_eq!(*f.borrow().0, 1);
| ^^^^^^^^^^^^^

error[E0614]: type u32 cannot be dereferenced
–> src\main.rs:62:14
|
62 | assert_eq!(*f.borrow().0, 1);
| ^^^^^^^^^^^^^

а все вопрос снимается вот так заработало

# ![allow(unused)]
fn main() {
	use std::cell::RefCell;
	use std::thread;
	
	thread_local!(static FOO: RefCell<(u32,u32)> = RefCell::new((1,3)));
	
	FOO.with(|f| {
		assert_eq!(f.borrow().0, 1);
	});
}
}

#2

Могли бы на пальцах объяснить зачем нужен thread local storage? и когда его стоит использовать?
Я вижу что передача thread local storage в поток равносильна передачи в поток копии значения.
иммутабельные значения так и остаются иммутабельные, а мутабельные меняются только в рамках данного потока. Так зачем все это? Какие тут юзкейсы?


#3

это гарантия однопоточности, а значит отсутствия рисков связанных с многопоточностью - гонки, локи и проч.
поскольку все, что попало в thread_local доступно только одному, владеющему потоку


#4

А как-же пример

thread::spawn(move|| {
    FOO.with(|f| {
        assert_eq!(*f.borrow(), 1);
        *f.borrow_mut() = 3; // Здесь thread_local доступно и в потоке
    });
});

Я так понимаю что thread local storage, реализует copy-on-write


#5

у каждого потока свое хранилище, в котором , соответственно, своя версия FOO