面试题答案
一键面试场景
thread_local!
宏用于创建线程本地存储(Thread - Local Storage,TLS)。在多线程编程中,某些数据需要在每个线程中独立存在且有自己的实例,这样不同线程对该数据的访问和修改不会相互干扰。常见场景如下:
- 每个线程需要独立的状态数据:例如,每个线程可能需要有自己独立的日志记录器实例,每个线程的日志记录不会相互混淆。
- 性能优化:避免多线程间共享数据的锁竞争,当每个线程都有自己的数据副本时,不需要额外的锁机制来保护对数据的访问。
示例代码
thread_local! {
static THREAD_LOCAL_VARIABLE: u32 = 0;
}
fn main() {
std::thread::scope(|s| {
s.spawn(|| {
THREAD_LOCAL_VARIABLE.with(|val| {
println!("Thread 1 initial value: {}", val);
THREAD_LOCAL_VARIABLE.with(|val| *val.borrow_mut() += 1);
println!("Thread 1 incremented value: {}", val);
});
});
s.spawn(|| {
THREAD_LOCAL_VARIABLE.with(|val| {
println!("Thread 2 initial value: {}", val);
THREAD_LOCAL_VARIABLE.with(|val| *val.borrow_mut() += 2);
println!("Thread 2 incremented value: {}", val);
});
});
});
}
在上述代码中:
thread_local!
宏定义了一个线程本地变量THREAD_LOCAL_VARIABLE
,初始值为0
。- 在每个线程中,通过
with
方法访问和修改这个线程本地变量。with
方法接受一个闭包,在闭包中可以对线程本地变量进行操作。这里使用borrow_mut
获取可变引用,对变量进行修改。每个线程对THREAD_LOCAL_VARIABLE
的操作都是独立的,不会影响其他线程中的值。