面试题答案
一键面试- 基本步骤:
- 使用
thread_local!
宏定义一个线程局部变量。这个宏接受一个块,在块中定义变量的初始值。 - 在不同线程中通过调用
with
方法来访问和操作这个线程局部变量。with
方法接受一个闭包,闭包中的参数是线程局部变量的可变引用。
- 使用
- 简单示例:
thread_local! {
static COUNTER: std::cell::Cell<i32> = std::cell::Cell::new(0);
}
fn main() {
let handles: Vec<_> = (0..10).map(|_| {
std::thread::spawn(move || {
COUNTER.with(|c| {
let n = c.get();
c.set(n + 1);
println!("Thread local counter in this thread: {}", c.get());
})
})
}).collect();
for handle in handles {
handle.join().unwrap();
}
}
在这个示例中:
- 首先使用
thread_local!
宏定义了一个线程局部变量COUNTER
,它的类型是std::cell::Cell<i32>
,初始值为0。std::cell::Cell
用于在不可变引用下实现内部可变性。 - 在
main
函数中,创建了10个线程。每个线程通过COUNTER.with
方法来访问和修改COUNTER
的值。在闭包中,先获取当前值,加1后再设置回去,并打印修改后的值。 - 最后等待所有线程执行完毕。