MST

星途 面试题库

面试题:Rust中线程生命周期管理里如何避免悬空引用

在Rust多线程编程场景下,假设我们有一个线程需要引用主线程中的某个数据结构,且主线程可能在线程结束前销毁该数据结构,怎样通过Rust的生命周期管理机制来避免产生悬空引用?请举例说明实现思路和关键代码。
25.3万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试

在Rust中,可以使用Arc(原子引用计数)和Mutex(互斥锁)来解决这个问题。Arc用于在多个线程间共享数据,Mutex用于保证同一时间只有一个线程可以访问数据,避免数据竞争。

以下是一个简单的示例:

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    // 创建一个可在多线程间共享的数据结构
    let data = Arc::new(Mutex::new(vec![1, 2, 3]));

    // 创建一个新线程,该线程会引用主线程中的数据
    let handle = thread::spawn({
        let data = Arc::clone(&data);
        move || {
            let mut data_guard = data.lock().unwrap();
            data_guard.push(4);
            println!("子线程中数据: {:?}", data_guard);
        }
    });

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

    // 主线程仍然可以访问数据
    let data_guard = data.lock().unwrap();
    println!("主线程中数据: {:?}", data_guard);
}

在上述代码中:

  1. 使用Arc<Mutex<T>>来包装数据结构vec![1, 2, 3],使得数据可以在多线程间安全共享。
  2. 在创建子线程时,通过Arc::clone克隆Arc智能指针,这样子线程和主线程都可以引用相同的数据。
  3. 在子线程和主线程中,通过Mutex::lock方法获取锁,访问完数据后,锁会自动释放。这样就避免了悬空引用和数据竞争问题。