MST

星途 面试题库

面试题:Rust中引用与函数指针结合在并发场景下的应用

在Rust的并发编程中,使用`std::thread::spawn`创建新线程。要求在新线程中结合引用与函数指针进行操作,确保线程安全,并且避免任何数据竞争。请编写完整代码并详细解释如何通过所有权、借用规则以及函数指针的使用来达成这一目标。
15.8万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::thread;

// 定义一个结构体
struct Data {
    value: i32,
}

// 定义一个函数,接受一个Data的引用并进行操作
fn operate_on_data(data: &mut Data) {
    data.value += 1;
}

fn main() {
    let mut data = Data { value: 0 };

    // 使用move闭包来转移所有权,确保线程安全
    let handle = thread::spawn(move || {
        // 这里使用函数指针调用函数
        let func_ptr: fn(&mut Data) = operate_on_data;
        func_ptr(&mut data);
    });

    // 等待线程结束
    handle.join().unwrap();

    println!("Final value: {}", data.value);
}

代码解释

  1. 所有权:通过move关键字将data的所有权转移到新线程的闭包中。这样,data在主线程中不再可用,避免了主线程和新线程同时访问data导致的数据竞争。
  2. 借用规则:在新线程内部,通过可变借用&mut Data来操作data。Rust的借用规则确保在同一时间只有一个可变引用,从而防止数据竞争。
  3. 函数指针:定义了一个函数指针func_ptr指向operate_on_data函数,通过函数指针调用函数来对data进行操作,展示了如何在这种场景下使用函数指针。这样,在新线程中结合引用(&mut Data)与函数指针(fn(&mut Data))进行操作,同时保证了线程安全并避免了数据竞争。