MST

星途 面试题库

面试题:Rust中thread_local!宏的基础使用

请简述在Rust中使用thread_local!宏创建线程局部存储的基本步骤,并给出一个简单示例,示例需展示如何在线程中访问和修改线程局部变量。
19.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 基本步骤
    • 使用thread_local!宏定义一个线程局部变量。这个宏接受一个块,在块中定义变量的初始值。
    • 在不同线程中通过调用with方法来访问和操作这个线程局部变量。with方法接受一个闭包,闭包中的参数是线程局部变量的可变引用。
  2. 简单示例
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后再设置回去,并打印修改后的值。
  • 最后等待所有线程执行完毕。