MST

星途 面试题库

面试题:Rust向量并发安全设计中的所有权与借用规则应用

在Rust中,我们知道向量(Vec)在并发场景下要保证安全需遵循所有权和借用规则。请描述在多线程环境下,如何通过所有权和借用规则来安全地共享一个Vec<T>,并且不会出现数据竞争或悬空指针等问题。假设你有一个Vec<i32>,需要在多个线程中读取其内容,简述实现思路并给出简单示例代码。
28.7万 热度难度
编程语言Rust

知识考点

AI 面试

面试题答案

一键面试
  1. 实现思路
    • 使用Arc(原子引用计数)来实现多个线程之间的数据共享,Arc允许在多个线程间共享数据。
    • 使用Mutex(互斥锁)来保护共享的数据,确保同一时间只有一个线程可以访问VecMutex提供了一种机制,通过锁定和解锁来控制对共享数据的访问,避免数据竞争。
  2. 示例代码
use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let shared_vec = Arc::new(Mutex::new(vec![1, 2, 3, 4, 5]));

    let mut handles = vec![];
    for _ in 0..3 {
        let clone = Arc::clone(&shared_vec);
        let handle = thread::spawn(move || {
            let lock = clone.lock().unwrap();
            for num in &*lock {
                println!("Thread saw number: {}", num);
            }
        });
        handles.push(handle);
    }

    for handle in handles {
        handle.join().unwrap();
    }
}

在上述代码中:

  • 首先创建了一个Arc<Mutex<Vec<i32>>>类型的shared_vecArc用于线程间共享,Mutex用于保护Vec
  • 在每个线程中,通过clone方法克隆Arc,并使用lock方法获取锁(如果锁可用),unwrap用于在获取锁失败时直接使程序崩溃(实际应用中可以更优雅地处理错误)。获取锁后,就可以安全地访问Vec中的数据了。
  • 最后,主线程等待所有子线程完成。