Rust线程局部存储详解与示例

需积分: 44 62 下载量 48 浏览量 更新于2024-08-07 收藏 3.91MB PDF 举报
"线程局部存储在编程语言如Rust中是一种特性,允许每个线程拥有独立的变量副本,互不干扰,从而无需考虑线程安全问题。Rust提供了两种实现线程局部存储的方式:一种是使用`#[thread_local]`属性,但这在稳定版中尚不支持,需要在nightly版本中启用`#![feature(thread_local)]`;另一种是使用`thread_local!`宏,已在稳定版中得到支持。 以下是一个使用`thread_local!`宏的示例代码: ```rust use std::cell::RefCell; use std::thread; thread_local! { static FOO: RefCell<u32> = RefCell::new(1) } fn main() { FOO.with(|f| { println!("main thread value1 {:?}", f.borrow()); *f.borrow_mut() = 2; println!("main thread value2 {:?}", f.borrow()); }); let t = thread::spawn(move || { FOO.with(|f| { println!("child thread value1 {:?}", f.borrow()); *f.borrow_mut() = 3; println!("child thread value2 {:?}", f.borrow()); }); }); t.join().ok(); FOO.with(|f| { println!("main thread value3 {:?}", f.borrow()); }); } ``` 在这个例子中,`FOO`在主线程和子线程中看起来像是同一个变量,但实际上它们是独立的。主线程修改`FOO`的值不会影响子线程的值,反之亦然。这表明在不同的线程中,`thread_local!`声明的变量实际上是分开存储的,每个线程都有自己的副本。 此外,提到的书籍《深入浅出Rust》是由范长春所著,该书涵盖了Rust的基础知识和内存安全等内容,包括版本管理、变量和类型、函数、trait、数组和字符串、模式解构、类型系统、宏以及内存管理相关的所有权、移动语义、借用和生命周期等重要概念。这本书对于理解Rust编程语言的特性和内存安全机制有着详尽的介绍,适合Rust初学者和进阶者学习使用。