MST

星途 面试题库

面试题:Rust RefCell借用规则与线程安全及生命周期的综合考量

假设我们有一个多线程环境,如下代码: ```rust use std::cell::RefCell; use std::thread; struct SharedData { data: RefCell<i32> } fn main() { let shared = SharedData { data: RefCell::new(0) }; let handle = thread::spawn(move || { // 在此线程中尝试修改shared.data的值,同时要保证不违反RefCell的借用规则,并且处理好线程安全问题 // 解释你的代码为什么能在这种复杂场景下正常工作,涉及到生命周期、借用规则以及线程安全等方面 }); handle.join().unwrap(); } ```
35.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
use std::cell::RefCell;
use std::thread;
use std::sync::{Arc, Mutex};

struct SharedData {
    data: RefCell<i32>
}

fn main() {
    let shared = Arc::new(Mutex::new(SharedData { data: RefCell::new(0) }));
    let handle = thread::spawn(move || {
        let inner_shared = shared.lock().unwrap();
        let mut data_ref = inner_shared.data.borrow_mut();
        *data_ref += 1;
    });
    handle.join().unwrap();
}
  1. 为什么这样能正常工作
    • 生命周期与借用规则
      • Arc 是引用计数智能指针,用于在多个线程间共享数据。它允许数据有多个所有者,但是这里使用 Mutex 来保证同一时间只有一个线程能访问内部数据。
      • Mutex 提供了互斥访问机制,通过 lock 方法获取锁,从而保证在同一时间只有一个线程能获取到 SharedData 的可变引用。
      • RefCell 是在单线程环境下实现内部可变性的类型,这里通过 borrow_mut 方法获取可变引用。因为 Mutex 保证了同一时间只有一个线程能访问 SharedData,所以不会违反 RefCell 的借用规则。
    • 线程安全
      • Arc<Mutex<SharedData>> 这种组合确保了数据在线程间的安全共享。Mutex 确保同一时间只有一个线程可以访问 SharedData,从而避免了数据竞争,保证了线程安全。